Как перебрать ячейки диапазона в excel: практическое руководство

Выборка данных в microsoft excel

Типовые задачи

Перебор ячеек в диапазоне (вариант 1)
В данном примере организован цикл For…Next и доступ к ячейкам осуществляется по их индексу. Вместо parRange(i) мы могли бы написать parRange.Item(i) (выше это объяснялось)

Обратите внимание, что мы в этом примере успешно применяем, как вариант с parRange(i,c), так и parRange(i). То есть, если мы применяем одночленную форму свойства Item, то диапазон перебирается по строкам (A1, B1, C1, A2, …), а если двухчленную, то столбец у нас зафиксирован и каждая итерация цикла — на новой строке

Это очень интересный эффект, его можно применять для вытягивания таблиц по вертикали. Но — продолжим!
Количество ячеек в диапазоне получено при помощи свойства .Count. Как .Item, так и .Count — это всё атрибуты коллекций, которые широко применяются в объектой модели MS Office и, в частности, Excel.
Sub Handle_Cells_1(parRange As Range)
  For i = 1 To parRange.Count
    parRange(i, 5) = parRange(i).Address & » = » & parRange(i)
  Next
End Sub

Перебор ячеек в диапазоне (вариант 2)
В этом примере мы использовали цикл For each…Next, что выглядит несколько лаконичней. Однако, в некоторых случаях вам может потребоваться переменная i из предыдущего примера, например, для вывода результатов в определенные строки листа, поэтому выбирайте удробную вам форму оператора For. Тут в цикле мы «вытягивали» все ячейки диапазона в текстовую строку, чтобы потом отобразить её через функцию MsgBox.

Sub Handle_Cells_2(parRange As Range)
  For Each c In parRange
    strLine = strLine & c.Address & «=» & c & «; »
  Next
  MsgBox strLine
End Sub

Перебор ячеек в диапазоне (вариант 3)
Если необходимо перебирать ячейки в порядке A1, A2, A3, B1, …, а не A1, B1, C1, A2, …, то вы можете это организовать при помощи 2-х циклов For. Обратите внимание, как мы узнали количество столбцов (parRange.Columns.Count) и строк (parRange.Rows.Count) в диапазоне, а также на использование свойства Cells. Тут Cells относится к листу и никак не связано с диапазоном parRange.

Sub Handle_Cells_3(parRange As Range)
  colNum = parRange.Columns.Count
  For i = 1 To parRange.Rows.Count
    For j = 1 To colNum
      Cells(i + (j — 1) * colNum, colNum + 2) = parRange(i, j)
    Next j
  Next i
End Sub  

Перебор строк диапазона
В цикле For each…Next перебираем коллекцию Rows объекта parRange. Для каждой строки формируем цвет на основе первых трёх ячеек каждой строки. Поскульку у нас в ячейках формула, присваивающая ячейке случайное число от 1 до 255, то цвета получаются всегда разные. Оператор With позволяет нам сократить код и, к примеру, вместо Line.Cells(2) написать просто .Cells(2).

Sub Handle_Rows_1(parRange As Range)
  For Each Line In parRange.Rows
    With Line
      .Interior.Color = RGB(.Cells(1), .Cells(2), .Cells(3))
    End With
  Next
End Sub  

Перебор столбцов
Перебираем коллекцию Columns. Тоже используем оператор With. В последней ячейке каждого столбца у нас хранится размер шрифта для всей колонки, который мы и применяем к свойству Line.Font.Size.

Sub Handle_Columns_1(parRange As Range)
  For Each Line In parRange.Columns
    With Line
      .Font.Size = .Cells(.Cells.Count)
    End With
  Next
End Sub

Перебор областей диапазона
Как вы знаете, в Excel можно выделить несвязанные диапазоны и проделать с ними какие-то операции. Поддерживает это и объект Range. Получить диапазон, состоящий из нескольких областей (area) очень легко — достаточно перечислить через запятую адреса соответствующих диапазонов: Range(«A1:B3, B5:D8, Z1:AA12«).
Вот такой составной диапазон и разбирается процедурой, показанной ниже. Организован цикл по коллекции Areas, настроен оператор with на текущий элемент коллекции, и ниже и правее относительно ячейки J1 мы собираем некоторые сведения о свойствах областей составного диапазона (которые каждый по себе, конечно же, тоже являются объектами типа Range). Для задания смещения от ячейки J1 нами впервые использовано очень полезное свойство Offset. Каждый диапазон получает случайный цвет, плюс мы заносим в таблицу порядковый номер диапазона (i), его адрес (.Address), количество ячеек (.Count) и цвет (.Interior.Color) после того, как он вычислен.

Sub Handle_Areas_1(parRange As Range)
  For i = 1 To parRange.Areas.Count
    With parRange.Areas(i)
      Cells(1, 10).Offset(i, 0) = i
      Cells(1, 10).Offset(i, 1) = .Address
      Cells(1, 10).Offset(i, 2) = .Count
      .Interior.Color = RGB(Int(Rnd * 255), Int(Rnd * 255), Int(Rnd * 255))
      Cells(1, 10).Offset(i, 3) = .Interior.Color
    End With
  Next
End Sub

Предупреждение о циклической ссылке

Когда Excel впервые находит циклическую ссылку, отображается предупреждающее сообщение. Нажмите кнопку ОК или закройте окно сообщения.

Когда вы закроете сообщение, в ячейке будет отображено либо нулевое, либо последнее вычисленное значение. И теперь, наверное, говорят: «повесить последнее вычисленное значение?» Да. В некоторых случаях можно успешно выполнить формулу, прежде чем выполнять вычисление. Например, формула, использующая функцию если , может работать, пока пользователь не введет аргумент (часть данных, которая должна выполняться правильно), которая приводит к тому, что формула будет вычислять саму себя. В этом случае Excel сохраняет значение из последнего успешного вычисления.

Если есть подозрение, что циклическая ссылка содержится в ячейке, которая не возвращает значение 0, попробуйте такое решение:

Щелкните формулу в строке формулы и нажмите клавишу ВВОД.

Внимание! Во многих случаях при создании дополнительных формул с циклическими ссылками предупреждающее сообщение в приложении Excel больше не отображается. Ниже перечислены некоторые, но не все, ситуации, в которых предупреждение появится

Пользователь создает первый экземпляр циклической ссылки в любой открытой книге.

Пользователь удаляет все циклические ссылки во всех открытых книгах, после чего создает новую циклическую ссылку.

Пользователь закрывает все книги, создает новую и вводит в нее формулу с циклической ссылкой.

Пользователь открывает книгу, содержащую циклическую ссылку.

При отсутствии других открытых книг пользователь открывает книгу и создает в ней циклическую ссылку.

Четвертый метод

Методом Гаусса можно решить практически любую систему уравнений. Суть в том, чтобы пошагово отнять одно уравнение из другого умножив их на отношение первых коэффициентов. Это прямая последовательность. Для полного решения необходимо еще провести обратное вычисление до тех пор, пока диагональ матрицы не станет единичной, а остальные элементы – нулевыми. Полученные значения в последнем столбце и являются искомыми неизвестными. Рассмотрим на примере.

1. Зададимся произвольной системой уравнений и выпишем все коэффициенты в отдельный массив.

2. Копируете первую строку в другое место, а ниже записываете формулу следующего вида: =C67:F67-$C$66:$F$66*(C67/$C$66).

Поскольку работа идет с массивами, нажимайте Ctrl+Shift+Enter, вместо Enter.

3. Маркером автозаполнения копируете формулу в нижнюю строку.

4. Выделяете две первые строчки нового массива и копируете их в другое место, вставив только значения.

5. Повторяете операцию для третьей строки, используя формулу

=C73:F73-$C$72:$F$72*(D73/$D$72). На этом прямая последовательность решения закончена.

6. Теперь необходимо пройти систему в обратном порядке. Используйте формулу для третьей строчки следующего вида =(C78:F78)/E78

7. Для следующей строки используйте формулу =(C77:F77-C84:F84*E77)/D77

8. В конце записываете вот такое выражение =(C76:F76-C83:F83*D76-C84:F84*E76)/C76

9. При получении матрицы с единичной диагональю, правая часть дает искомые неизвестные. После подстановки полученных цифр в любое из уравнений значения по обе стороны от знака равно являются идентичными, что говорит о правильном решении.

Метод Гаусса является одним из самых трудоемких среди прочих вариантов, однако позволяет пошагово просмотреть процесс поиска неизвестных.

Как видите, существует несколько методов решения уравнений в редакторе. Однако каждый из них требует определенных знаний в математике и четкого понимания последовательности действий. Однако для упрощения можно воспользоваться онлайн калькулятором, в который заложен определенный метод решения системы уравнений. Более продвинутые сайты предоставляют несколько способов поиска неизвестных.

Жми «Нравится» и получай только лучшие посты в Facebook ↓

Цикл в excel с помощью формул

Я здесь новичок и это мой первый пост.

Помогите пожалуйста составить цикл.Думаю, что правильнее будет через макрос, но, можно и через формулу. В них, к сожалению, не силен, опыт нулевой. Похожие темы читал на этом форуме, есть очень похожие решения, но доработать их не могу, вседствие малоопытности. Итак.

. Требуется подобрать текстовые сочетания содержимого ячеек, но не все возможные, а подчиняющиеся порядковому чередованию:

Дано: 4 столбца с текстовыми значениями, количество строк во всех столбцах разное.

Пример:______________| -|A1|B1|C1|D1||——————-|1 | A | 1| a| X ||2 | B | 2| b| Y ||3 | C | _| c| Z ||4 | D | _| d| _ ||5 | E | _| _| _ |———————Хочу в итоговой колонке получить массив данных:

1 A1aX2 A1aY3 A1aZ4 A1bX5 A1bY. 12 A1dZ13 A2aX. 24 A2dZ25 B1aX. . 120 E2dZ

Для упрощения решения могу предложить добавить в каждый исходный столбец количество символов для равного значения строк в каждом столбце:

Впоследствии я смогу удалить из итоговой ячейки результаты, содержащие символы «$».И сразу вопрос: можно ли создать такой макрос, который не будет зависеть от фиксированного числа строк в столбце, а будет запускать очередной цикл, когда «наткнется» на пустую ячейку?

В реальной задаче в столбце A1 будет 64 значения, в B1=32, C1=64, D1=16.Знаю, что на лист весь вывод не поместится, поэтому, либо буду использовать в колонке A1 каждый раз по 2 значения (получится как раз 65536), либо попрошу опять же здесь помощи, чтобы реализовать переход на другой лист с помощью такого макроса (вычитал на одном из форумов):

Буду благодарен если поможете реализовать идею, и объяснить принцип действия конкретного макроса.Прикрепил сам файл с задачей, а то строки таблицы съезжают.

VBA Excel. Цикл For… Next

Цикл For. Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For. Next.

Цикл For. Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each. Next.

Применение формулы с циклом в Excel: несколько практических примеров

Пример 1. Расчет стоимости заказа

Предположим, у нас есть таблица, в которой перечислены доступные для заказа товары и их цены. Клиент может выбрать несколько товаров из этого списка, и наша задача — посчитать общую стоимость заказа. Мы можем использовать формулу с циклом, чтобы автоматически произвести подсчет стоимости, учитывая выбранные клиентом товары.

Например, для этой задачи можно использовать функцию SUMIF, которая позволяет суммировать значения в столбце в зависимости от фильтра. Временную переменную можно использовать для сохранения частичной суммы:

Здесь условие в первом SUMIF позволяет посчитать сумму заказанных товаров «X», а условие во втором SUMIF — сумму заказанных товаров «Y» с наценкой в 20%.

Пример 2. Расчет остатка на счету в банке

Иногда нужно отслеживать, сколько денег осталось на банковском счете. Это можно сделать, используя формулу с циклом и таблицу со списком транзакций.

Здесь мы можем использовать функцию SUM, чтобы автоматически произвести подсчет общей суммы транзакций. Временную переменную можно использовать для отслеживания остатка на счету после каждой транзакции. Например:

Здесь INITIAL_BALANCE — это начальный баланс на счете, а B2:B10 и C2:C10 — это столбцы с приходами и расходами соответственно.

Пример 3. Анализ результатов опроса

Иногда нужно проанализировать результаты опроса или исследования, включающего большое количество вариантов ответов. Мы можем использовать формулу с циклом, чтобы автоматически подсчитывать количество ответов в каждой категории.

Здесь мы можем использовать функцию COUNTIF, которая позволяет подсчитать количество ячеек с заданным значением. Например:

Здесь A2:A10 — это столбец с ответами на вопросы, «Ответ 1», «Ответ 2» и «Ответ 3» — это три варианта ответа на вопросы, которые мы хотим подсчитать.

Основы VBA

Прежде чем углубиться в код, давайте начнем с обозначения ячейки или диапазона в VBA. Во-первых, VBA — это объектно-ориентированный язык программирования, что означает, что язык ссылается на каждый элемент как на объекты. Объекты имеют свойства, которые их определяют, и они могут инкапсулировать другие объекты или коды. Таким образом, отдельная ячейка, диапазон ячеек, рабочий лист или программное обеспечение Excel в целом являются объектом для VBA. Вы можете представить это как иерархическую модель.

Изображение иллюстрирует лишь небольшую часть объектов Excel в VBA. Экземпляр Excel содержит коллекцию Workbooks . Коллекция — это группа связанных объектов. Например, если вы откроете две рабочие книги, в коллекции Workbooks будет два объекта Workbook. Каждый объект Workbook имеет свои собственные листы в коллекции Worksheets. Эта структура применима ко всем.

VBA охватывает все ячейки и ссылки на основе ячеек в объекте с именем Range. Теоретически, когда ссылаются на конкретный объект, вам также необходимо указать его родителей. В синтаксисе VBA оператор dot (.) используется для перемещения по иерархии объектов. Например, для доступа к объекту Range код должен быть:

Приложение.Рабочие книги.Рабочие листы.Диапазон

Однако эта ссылка неоднозначна, когда нужно указать, на какую книгу Excel вы ссылаетесь. Чтобы сделать это, вы должны указать имя или порядковый номер (начиная с 1) конкретного объекта, на который вы ссылаетесь. Этот подход аналогичен формулам Excel — аргумент указывается в круглых скобках. Например, для ссылки на объект range на рабочем листе “Sheet1” рабочей книги “Book1.xlsm”:

Приложение.Рабочие книги ("Book1.xlsm").Рабочие листы ("Sheet1").Диапазон

или

Приложение.Рабочие книги (1).Рабочие листы (1).Диапазон

Вам не обязательно каждый раз указывать все родительские элементы для объекта Range . Если вы собираетесь работать на активном листе активной книги, вы можете просто использовать диапазон.

Excel VBA для выбора каждого второго столбца

Используя макросы VBA в Excel, вы можете автоматизировать процесс выбора каждого второго столбца с точностью и эффективностью.

Макрос для выбора каждого нечетного столбца в Excel

Этот код VBA позволяет выбирать каждый нечетный столбец в Excel, например 1, 3, 5 и т. д. Это достигается за счет перебора столбцов в выбранном пользователем диапазоне и создания нового диапазона, включающего только нечетные столбцы. Затем выбирается результирующий диапазон, что позволяет легко идентифицировать нужные столбцы и манипулировать ими.

Код VBA для выбора каждого нечетного столбца

Sub SelectOddColumns() Dim selectedRange As Range Dim i As Integer Dim newRange As Range ‘определить выбранный диапазон Set selectedRange = Selection ‘для каждого столбца в выбранном диапазоне For i = 1 To selectedRange.Columns.Count Step 2 ‘добавьте каждый четный столбец в новый диапазон Если newRange Is Nothing, то установите newRange = selectedRange.Columns(i) Else Set newRange = Union(newRange, selectedRange.Columns(i)) End If Next i ‘ выберите новый диапазон If Not newRange Is Nothing Then newRange.Select End Если конец суб

Макрос для выбора каждого четного столбца в Excel

Следующий код VBA позволяет выбрать каждый четный столбец, например 2, 4, 6 и т. д. Он автоматизирует процесс, перебирая столбцы в предварительно выбранном диапазоне и создавая новый диапазон, включающий только четные столбцы.

Код VBA для выбора каждого четного столбца

Sub SelectEvenColumns() Dim selectedRange As Range Dim i As Integer Dim newRange As Range ‘определить выбранный диапазон Set selectedRange = Selection ‘для каждого столбца в выбранном диапазоне For i = 2 To selectedRange.Columns.Count Step 2 ‘добавьте каждый четный столбец в новый диапазон Если newRange Is Nothing, то установите newRange = selectedRange.Columns(i) Else Set newRange = Union(newRange, selectedRange.Columns(i)) End If Next i ‘ выберите новый диапазон If Not newRange Is Nothing Then newRange.Select End Если конец суб

Чтобы добавить коды в книгу, выполните действия, описанные в статье Как вставить код VBA в Excel.

Чтобы выбрать каждый второй столбец с помощью макроса, выполните следующие действия:

  1. Выделите диапазон, в котором вы хотите выбрать столбцы.
  2. Нажмите Alt + F8, чтобы открыть диалоговое окно макроса.
  3. Выберите нужный макрос — SelectOddColumns или SelectEvenColumns.
  4. Нажмите «Выполнить», чтобы выполнить код.

Excel функция перебора значений

Добрый день ! Подскажите если знаете. )

Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000

Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя

Заранее благодарен за ответ !

Добрый день ! Подскажите если знаете. )

Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000

Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя

Заранее благодарен за ответ ! Rafting

Сообщение Добрый день ! Подскажите если знаете. )

Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000

Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя

Заранее благодарен за ответ ! Автор — RaftingДата добавления — 10.04.2017 в 15:08

Полезные советы и лучшие практики для работы с диапазонами ячеек в Excel

1. Используйте функции генерации диапазона:

Прежде чем начать перебор ячеек в Excel, можно воспользоваться функцией генерации диапазона, чтобы указать необходимые ячейки. Например, функция RANGE() позволяет указать диапазон ячеек с помощью формулы, в которой указываются начальная и конечная ячейки, а также шаг. Это может быть полезно, если нужно перебрать только определенные ячейки в большом диапазоне данных.

2. Используйте циклы для перебора ячеек:

Для перебора ячеек в Excel можно использовать циклы, такие как цикл For или цикл Do While. Это позволяет выполнить определенные действия с каждой ячейкой в диапазоне. Например, вы можете использовать цикл For Each для перебора всех ячеек в диапазоне с использованием массива Cells().

3. Используйте условия для проверки значений ячеек:

При работе с диапазонами ячеек в Excel часто требуется проверять значения ячеек и выполнять определенные действия в зависимости от результатов проверки. Для этого можно использовать условные операторы, такие как оператор If. Например, вы можете проверять каждую ячейку в диапазоне на соответствие определенному условию и выполнять определенные действия, если условие истинно.

4. Используйте функции обработки данных для ячеек:

Excel предлагает множество функций для обработки данных в ячейках. Например, с помощью функции Sum() вы можете сложить значения ячеек в диапазоне, с помощью функции Average() — рассчитать среднее значение, а с помощью функции Count() — подсчитать количество непустых ячеек. Использование подобных функций может существенно упростить работу с диапазонами ячеек в Excel.

5. Используйте автоматическое заполнение для работы с повторяющимися паттернами:

Если в диапазоне ячеек имеются повторяющиеся паттерны, то можно воспользоваться функцией автоматического заполнения в Excel. Например, если в первых двух ячейках диапазона расположены числа 1 и 2, то вы можете выделить эти ячейки и затем перетащить за угол ячейку, чтобы Excel автоматически заполнил остальные ячейки паттерном. Это может быть полезно, если требуется заполнить большой диапазон ячеек с повторяющимся паттерном.

В заключение, работа с диапазонами ячеек в Excel может быть более эффективной, если вы используете функции и циклы, проверяете значения ячеек с помощью условий, применяете функции обработки данных и воспользуетесь функцией автоматического заполнения для повторяющихся паттернов. Учтите эти полезные советы и лучшие практики, чтобы упростить свою работу с диапазонами ячеек в Excel и повысить эффективность выполнения задачи.

Использование надстройки

В Эксель нет встроенного инструмента, который бы помогал автоматически переводить цифры в слова. Поэтому для решения поставленной задачи используют специальные надстройки.

Одной из самых удобных является надстройка NUM2TEXT. Она позволяет поменять цифры на буквы через Мастер функций.

  1. Открываем программу Excel и переходим во вкладку «Файл».
  2. Перемещаемся в раздел «Параметры».
  3. В активном окне параметров переходим в раздел «Надстройки».
  4. Далее, в параметре настроек «Управление» устанавливаем значение «Надстройки Excel». Жмем на кнопку «Перейти…».
  5. Открывается небольшое окно надстроек Excel. Жмем на кнопку «Обзор…».
  6. В открывшемся окне ищем предварительно скачанный и сохраненный на жесткий диск компьютера файл надстройки NUM2TEXT.xla. Выделяем его и жмем на кнопку «OK».
  7. Мы видим, что данный элемент появился среди доступных надстроек. Ставим галочку около пункта NUM2TEXT и жмем на кнопку «OK».
  8. Для того, чтобы проверить как работает только что установленная надстройка пишем в любой свободной ячейке листа произвольное число. Выделяем любую другую ячейку. Кликаем по значку «Вставить функцию». Он расположен слева от строки формул.
  9. Запускается Мастер функций. В полном алфавитном перечне функций ищем запись «Сумма_прописью». Её раньше не было, но она появилась тут после установки надстройки. Выделяем эту функцию. Жмем на кнопку «OK».
  10. Отрывается окно аргументов функции Сумма_прописью. Оно содержит только одно поле «Сумма». Сюда можно записать обычное число. Оно в выделенной ячейке отобразиться в формате записанной прописью денежной суммы в рублях и копейках.
  11. После этого, любое число, которое записано в ячейку, указанную вами, будет отображаться в денежном виде прописью в том месте, где установлена формула функции.

Функцию можно также записать и вручную без вызова мастера функций. Она имеет синтаксис Сумма_прописью(сумма) или Сумма_прописью(координаты_ячейки). Таким образом, если вы в ячейке запишите формулу , то после нажатия кнопки ENTER в этой ячейке отобразиться надпись «Пять рублей 00 копеек».

Если вы введете в ячейку формулу , то в таком случае, любое число, внесенное в ячейку A2 будет отображаться тут денежной суммой прописью.

Как видим, несмотря на то, что в Excel нет встроенного инструмента для преобразования чисел в сумму прописью, эту возможность можно довольно легко получить, просто установив необходимую надстройку в программу.

Мы рады, что смогли помочь Вам в решении проблемы.

Помогла ли вам эта статья?

Да Нет

Как правило, в финансовых документах довольно часто указывают сумму не только в виде числа, но и прописью. Вручную это делать сложно и долго. Гораздо проще автоматически преобразовать все значения при помощи функций. В данной статье мы рассмотрим, как в Excel сделать сумму прописью.

Для начала нужно открыть Эксель и написать какое-нибудь число.

Понравилась статья? Поделиться с друзьями:
Technology trends
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: