Перебрать столбец в excel

Skip to content

Как сделать перебор диапазона ячеек

На чтение 2 мин. Просмотров 14.1k.

Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

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

Код макроса

Sub PereborDiapazonaYacheek()
'Шаг 1: Объявить переменные
Dim MyRange As Range
Dim MyCell As Range
'Шаг 2: Определение целевого диапазона.
Set MyRange = Range("D6:D17")
'Шаг 3: Запуск цикла через диапазон.
For Each MyCell In MyRange
'Шаг 4: Какое-либо действие с каждой ячейкой.
If MyCell.Value > 3000 Then
MyCell.Font.Bold = True
End If
'Шаг 5: Перейти к следующей ячейке в диапазоне
Next MyCell
End Sub

Как этот код работает

  1. Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
  2. На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
  3. На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
  4. После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
  5. На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

 

Есть книга. В ней 20-30 строк и 600-700 столбцов
Задача состоит в следующем: Нужно перебрать всевозможные комбинации столбцов
Например
столбцы 1, 1+2, 2, 1+3, 3, 1+4…, 1+2+3, 2+3, ,1+2+4,,1+2+5…,1+2+3+4,,1+3+4,3+4 итд
начал писать цикл, но понял что одним циклом тут не ограничится.
может быть есть какой то более простой способ перебора всех комбинаций?

 

В файле нет примера результата.  

 

kalbasiatka, не важен результат (но для примера можно сумму по строке входящих в перебор столбцов заносить на другой лист)
главное это перебор

 

Допустим: Программа перебрала все возможные комбинации и вывела сообщение «Перебор завершен».
Вам так надо? Нет? А как?
В файле нет примера результата.

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Михаил Лебедев, да, по сути так и надо

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#6

23.01.2016 20:13:27

Цитата
да, по сути так и надо

Ну, если так и надо… Пожалуйста. Работает моментально.

Скрытый текст

 

vikttur, очень смешно! а где цикл самого перебора? msgbox должен после него быть а не просто вывести окно перебор завершен
Приколисты)))))

 

Catboyun

Пользователь

Сообщений: 1631
Регистрация: 09.05.2015

#8

23.01.2016 20:16:34

Цитата
andrey062006 написал:Приколисты

Вы же сами сказали:

Цитата
andrey062006 написал:не важен результат
 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

andrey062006, смысл перебора, если результат не нужен? Вам уже говорили приложить пример результата.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

JayBhagavan,в лист результата пусть заносятся в каждую новую строку текущая комбинация столбцов

 

Михаил Лебедев

Пользователь

Сообщений: 2856
Регистрация: 17.01.2013

#11

23.01.2016 20:25:10

Цитата
andrey062006 написал:
(но для примера можно сумму по строке входящих в перебор столбцов заносить на другой лист)

Занес сумму по строке входящих в перебор столбцов на другой лист
=СУММ(Лист1!B2:WR2)

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Михаил Лебедев, ОМГ, вот поэтому я и написал так, как написал, чтобы не зацикливались на суммах и прочем. НУЖЕН ЦИКЛ ПЕРЕБОРА КОМБИНАЦИЙ СТОЛБЦОВ а не конкретная сумма.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

Формула:
=СЦЕПИТЬ(ЕСЛИ(СТРОКА()-1;ИНДЕКС($A:$A;СТРОКА()-1);Лист1!$B$1);»,»;ИНДЕКС(Лист1!$1:$1;1;СТОЛБЕЦ(Лист1!$B$1)+СТРОКА()))

В макросе не вижу смысла.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Михаил Лебедев

Пользователь

Сообщений: 2856
Регистрация: 17.01.2013

#14

23.01.2016 20:36:39

Цитата
andrey062006 написал:
НУЖЕН ЦИКЛ ПЕРЕБОРА КОМБИНАЦИЙ СТОЛБЦОВ

ЗАЧЕМ НУЖЕН?
и
1,2 и 2,1 — это одна и та же комбинация?

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Михаил Лебедев, 1и2и3и4, 1и2, 1и3, 1и4, 1и2и4, 1и3и4, 2и3и4, 2и4, 2и3, 3и4, 1, 2, 3, 4
Вот сколько комбинайций только из 4 столбцов
А их больше 600
Для примера добавил макрос цикла который перебирает только по 1 столбцу
А нужно чтобы комбинации перебирал а не только по 1

 

Михаил Лебедев

Пользователь

Сообщений: 2856
Регистрация: 17.01.2013

#16

23.01.2016 20:58:59

Цитата
andrey062006 написал:
1и2и3и4, 1и2, 1и3, 1и4, 1и2и4, 1и3и4, 2и3и4, 2и4, 2и3, 3и4 Вот сколько комбинайций только из 4 столбцов

и

Цитата
andrey062006 написал:
Нужно перебрать всевозможные комбинации столбцов

Вы сами себе противоречите. Это — не все комбинации, например — вот эти — не перечислили
1и1и2и1 1и2и2и1 1и2и2и2 и т.д.

Вамнужны действительно ВСЕ комбинации или только отвечающие определенному условию? (Или алгоритму?)

Изменено: Михаил Лебедев23.01.2016 20:59:18

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Михаил Лебедев, 1и1и2и1 это не то. Уточнюсь, комбинации из уникальных столбцов, в комбинации 1и1и2и1 три раза повторяется столбец 1. Короче один столбец в комбинации учавствует только один раз, а не несколько.

Изменено: andrey06200623.01.2016 21:02:09

 

Михаил Лебедев

Пользователь

Сообщений: 2856
Регистрация: 17.01.2013

#18

23.01.2016 21:08:42

Цитата
Михаил Лебедев написал:
1,2 и 2,1 — это одна и та же комбинация?

(повторюсь)

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Михаил Лебедев, да, это одна и та же комбинация

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

andrey062006, сообщите конечную цель перебора.
Перебрать 600 столбцов, генерируя все возможные комбинации — невозможно.
для 4х столбцов (чисел) существует 31 вариант сочетаний 2^4-1
для 600 чисел — 2^600-1 = 4,14951556888099E+180 вариантов

если скажите, какова конечная цель, то возможно есть другое решение, а не простой перебор всех вариантов.
Например, если из 600 столбцов нужно выбирать не более 4х, то это всего 5 млрд. комбинаций (5 382 165 350), что вполне возможно перебрать за разумное время.

Изменено: MCH23.01.2016 21:28:17

 

MCH, ну допустим можно ограничить комбинацию от 1 до 20 столбцов в комбинации.
Пусть будет если сумма ячеек 2-ой строки выбранных (входящих в комбинацию) столбцов больше 5 (к примеру) то пусть она заносит в лист «результат» эту комбинацию столбцов (естественно для каждой комбинации новая строка).

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

#22

23.01.2016 22:37:38

Макрос, который генерирует сочетания чисел, без подробного описания задачи ничего другого предложить не смогу

Код
Sub main()
    Dim a&(), b&(), i&, clm&, rws&, m&, n&, nMin&, nMax&, p&, txt$
    n = 20 'выборка из 20 чисел
    nMin = 1 'минимальная выборка
    nMax = 5 'максимальная выборка
    If nMin < 1 Then nMin = 1 'проверка на правильность значений
    If nMax > n Then nMax = n
      
    rws = 1 ' начальная строка для вывода
    clm = 1 'начальный столбец для вывода
    Cells(rws, clm).CurrentRegion.ClearContents 'очищаем диапазон вывода
    
    For m = nMin To nMax 'перебираем все выборки
        ReDim a&(1 To m)
        For i = 1 To m: a(i) = i: Next i 'начальная расстановка
        If m = n Then p = 1 Else p = m
        Do 'перебираем все сочетания m из n
            'здесь нужно сделать проверку, если очерендная генерация нам подходит
            If True Then 'вместо True должно быть условие при котороам будем запоминать генерацию
                txt = ""
                For i = 1 To m 'генерируем строку для вывода
                    txt = txt & IIf(txt = "", "", ", ") & a(i)
                Next i
                Cells(rws, clm) = txt 'сохраняем строку с индексами
                rws = rws + 1
                If rws > Rows.Count Then rws = 1: clm = clm + 1
            End If
            If a(m) = n Then p = p - 1 Else p = m
            If p Then
                For i = m To p Step -1
                    a(i) = a(p) + i - p + 1
                Next i
            End If
        Loop While p
    Next m
End Sub
 

andrey062006

Гость

#23

24.01.2016 00:23:59

MCH, Макрос вроде нормально работает но никак не могу его разобрать что там к чему. Какие то непонятные переменные. В каждом цикле какая переменная отвечает за выбранные столбцы или как макрос понимает какие столбцы сейчас просматриваются?
Как сделать чтобы текущие просматриваемые столбцы снизу (или сверху) например помечались плюсом, после проверки строка эта зачищалась и в новые выборке опять новые столбцы чтобы помечались плюсом ну ии каким-либо другим знаком?

Изменено: andrey06200624.01.2016 01:06:13

О чём пойдёт речь?

Знакомство с объектной моделью Excel следует начинать с такого замечательного объекта, как Range. Поскольку любая ячейка — это Range, то без знания, как с этим объектом эффективно взаимодействовать, вам будет затруднительно программировать для Excel. Это очень ладно-скроенный объект. При некоторой сноровке вы найдёте его весьма удобным в эксплуатации.

Что такое объекты?

Мы собираемся изучать объект Range, поэтому пару слов надо сказать, что такое, собственно, «объект«. Всё, что вы наблюдаете в Excel, всё с чем вы работаете — это набор объектов. Например, лист рабочей книги Excel — не что иное, как объект типа WorkSheet. Однотипные объекты объединяют в коллекции себе подобных. Например, листы объединены в коллекцию Sheets. Чтобы не путать друг с другом объекты одного и того же типа, они имеют отличающиеся имена, а также номер индекса в коллекции. Объекты имеют свойства, методы и события.

Свойства — это информация об объекте. Часто эти свойства можно менять, что автоматически влечет изменения внешнего вида объекта или его поведения. Например свойство Visible объекта Worksheet отвечает за видимость листа на экране. Если ему присвоить значение xlSheetHidden (это константа, которая по факту равно нулю), то лист будет скрыт.

Методы — это то, что объект может делать. Например, метод Delete объекта Worksheet удаляет себя из книги. Метод Select делает лист активным.

События — это механизм, при помощи которого вы можете исполнять свой код VBA сразу по факту возникновения того или иного события с вашим объектом. Например, есть возможность выполнять ваш код, как только пользователь сделал текущим определенный лист рабочей книги, либо как только пользователь что-то изменил на этом листе.

Range это диапазон ячеек. Минимум — одна ячейка, максимум — весь лист, теоретически насчитывающий более 17 миллиардов ячеек (строки 2^20 * столбцы 2^14 = 2^34).
В Excel объявлены глобально и всегда готовы к использованию несколько коллекций, имеющий членами объекты типа Range, либо свойства это же типа.
Коллекции глобального объекта Application: Cells, Columns, Rows, а также свойства Range, Selection, ActiveCell, ThisCell.
ActiveCell — активная ячейка текущего листа, ThisCell — если вы написали пользовательскую функцию рабочего листа, то через это свойство вы можете определить какая конкретно ячейка в данный момент пересчитывает вашу функцию. Об остальных перечисленных объектов речь пойдёт ниже.

Работа с отдельными ячейками

Синтаксическая форма Комментарии по использованию
RangeD5«) или [D5] Ячейка D5 текущего листа. Полная и краткая формы. Тут применим только синтаксис типа A1, но не R1C1. То есть такая конструкция RangeR1C2«) — вызовет ошибку, даже если в книге Excel включен режим формул R1C1.

Разумеется после этой формы вы можете обратиться к свойствам соответствующей ячейки. Например, RangeD5«).Interior.Color = RGB(0, 255, 0).
Cells(5, 4) или Cells(5, «D») Ячейка D5 текущего листа через свойство Cells. 5 — строка (row), 4 — столбец (column). Допустимость второй формы мало кому известна.
Cells(65540) Ячейку D5 можно адресовать и через указание только одного параметра свойсва Cells. При этом нумерация идёт слева направо, потом сверху вниз. То есть сначала нумеруется вся строка (2^14=16384 колонок) и только потом идёт переход на следующую строку. То есть Cells(16385) вернёт вам ячейку A2, а D5 будет Cells(65540). Пока данный способ выглядит не очень удобным.

Работа с диапазоном ячеек

Синтаксическая форма Комментарии по использованию
Range(«A1:B4«) или [A1:B4] Диапазон ячеек A1:B4 текущего листа. Обратите внимание, что указываются координаты верхнего левого и правого нижнего углов диапазона. Причём первый указываемый угол вполне может быть правым нижним, это не имеет значения.
Range(Cells(1, 1), Cells(4, 2)) Диапазон ячеек A1:B4 текущего листа. Удобно, когда вы знаете именно цифровые координаты углов диапазона.

Работа со строками

Синтаксическая форма Комментарии по использованию
Range3:5«) или [3:5] Строки 3, 4 и 5 текущего листа целиком.
RangeA3:XFD3«) или [A3:XFD3] Строка 3, но с указанием колонок. Просто, чтобы вы понимали, что это тождественные формы. XFD — последняя колонка листа.
Rows3:3«) Строка 3 через свойство Rows. Параметр в виде диапазона строк. Двоеточие — это символ диапазона.
Rows(3) Тут параметр — индекс строки в массиве строк. Так можно сослаться только не конкретную строку. Обратите внимание, что в предыдущем примере параметр текстовая строка «3:3» и она взята в кавычки, а тут — чистое число.

Работа со столбцами

Синтаксическая форма Комментарии по использованию
RangeB:B«) или [B:B] Колонка B текущего листа.
RangeB1:B1048576«) или [B1:B1048576] То же самое, но с указанием номеров строк, чтобы вы понимали, что это тождественные формы. 2^20=1048576 — максимальный номер строки на листе.
ColumnsB:B«) То же самое через свойство Columns. Параметр — текстовая строка.
Columns(2) То же самое. Параметр — числовой индекс столбца. «A» -> 1, «B» -> 2, и т.д.

Весь лист

Синтаксическая форма Комментарии по использованию
RangeA1:XFD1048576«) или [A1:XFD1048576] Диапазон размером во всё адресное пространство листа Excel. Воспринимайте эту таблицу лишь как теорию — так работать с листами вам не придётся — слишком большое количество ячеек. Даже современные компьютеры не смогут помочь Excel быстро работать с такими массивами информации. Тут проблема больше даже в самом приложении.
Range1:1048576«) или [1:1048576] То же самое, но через строки.
RangeA:XFD«) или [A:XFD] Аналогично — через адреса столбцов.
Cells Свойство Cells включает в себя ВСЕ ячейки.
Rows Все строки листа.
Columns Все столбцы листа.

Следует иметь в виду, что свойства Range, Cells, Columns и Rows имеют как объекты типа Worksheet, так и объекты Range. Соответственно в первом случае эти коллекции будут относиться ко всему листу и отсчитываться будут от A1, а вот в случае конкретного объекта Range эти коллекции будут относиться только к ячейкам этого диапазона и отсчитываться будут от левого верхнего угла диапазона. Например Cells(2,2) указывает на ячейку B2, а Range(«C3:D5»).Cells(2,2) укажет на D4.

Также много путаницы в умы вносит тот факт, что объект Range имеет одноименное свойство range. К примеру, Range(«A100:D500»).Range(«A2») — тут выражение до точки ( Range(«A100:D500») ) является объектом Range, выражение после точки ( Range(«A2») ) — свойство range упомянутого объекта, но возвращает это свойство тоже объект типа Range. Вот такие пироги. Из этого следует, что такая цепочка может иметь и более двух членов. Практического смысла в этом будет не много, но синтаксически это будут совершенно корректно, например, так: Range(«CV100:GR200»).Range(«J10:T20»).Range(«A1:B2») укажет на диапазон DE109:DF110.

Ещё один сюрприз таится в том, что объекты Range имеют свойство по-умолчанию Item( RowIndex [, ColumnIndex] ). По правилам VBA при ссылке на default свойства имя свойства (Item) можно опускать. Кстати говоря, то что вы привыкли видеть в скобках после Cells, есть не что иное, как это дефолтовое свойство Item, а не родные параметры Cells, который их не имеет вовсе. Ну ладно к Cells все привыкли и это никакого отторжения не вызывает, но если вы увидите нечто подобное — Range(«C3:D5»)(2,2), то, скорее всего, будете несколько озадачены, а тем временем — это буквально тоже самое, что и у Cells — всё то же дефолтовое свойство Item. Последняя конструкция ссылается на D4. А вот для Columns и Rows свойство Item может быть только одночленным, например Columns(1) — и к этой форме мы тоже вполне привыкли. Однако конструкции вида Columns(2)(3)(4) могут сильно удивить (столбец 7 будет выделен).

Примеры кода

Скачать

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

  1. Перебор ячеек в диапазоне (вариант 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. Перебор ячеек в диапазоне (вариант 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. Перебор ячеек в диапазоне (вариант 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  
     
  4. Перебор строк диапазона

    В цикле 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  
     
  5. Перебор столбцов

    Перебираем коллекцию 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 
     
  6. Перебор областей диапазона

    Как вы знаете, в Excel можно выделить несвязанные диапазоны и проделать с ними какие-то операции. Поддерживает это и объект Range. Получить диапазон, состоящий из нескольких областей (area) очень легко — достаточно перечислить через запятую адреса соответствующих диапазонов: RangeA1: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
     

Продолжение следует…

Читайте также:

  • Поиск границ текущей области

  • Массивы в VBA

  • Структуры данных и их эффективность

  • Автоматическое скрытие/показ столбцов и строк

ctac1412

18 / 18 / 2

Регистрация: 12.02.2013

Сообщений: 387

20.07.2016, 22:29

 [ТС]

11

pashulka, Если честно не совсем понял, где у нас была проблема)))
Не подскажете, новая запара.
Я усложняю формулу.
задача.
Отобрать лишь те ячейки где
А1 дата А2 дата+год и минус день.

Но выскакивает ошибка 13 type missmath

главное через мджбокс получается через активцел посчитать

Visual Basic
1
2
3
Public Sub q1()
MsgBox (DateAdd("yyyy", 1, DateAdd("d", -1, ActiveCell.Text)))
End Sub

а так не получается

Visual Basic
1
2
    For Each iCell In Range(Cells(1, "F"), Cells(Rows.Count, "F").End(xlUp))
        If iCell.Text = (DateAdd("yyyy", 1, DateAdd("d", -1, iCell(1, 2).Text))) Then

Это потому что первые две строчки, не даты… и поэтому он не может их посчитать, нужно условие на проверку… Что бы только данные чекал…. Это то что я понял… Как проверить не знаю… пока удалил строчки, но резулльтата все равно нет буду искать дальше))) ни одной строки не нашел))

Добавлено через 11 минут
Решил вопрос с формулировкой.

Были разные value и text… И порядок не тот…
если кому понадобится, вот код сравнивающий левую столбик с правыи….

П.С. Почему то не получается сравнить правый с левом, то бишь справа на лево….. Значение левого столбца выдается не верно. Почему так может получаться???

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
    For Each iCell In Range(Cells(1, "F"), Cells(Rows.Count, "F").End(xlUp))
    x = (DateAdd("yyyy", 1, DateAdd("d", -1, iCell.Value)))
    b = iCell(1, 2).Value
        If x = b Then
           ListBox1.AddItem 'Ìîæíî óæå çäåñü çàïîëíèòü ïåðâûé ñòîëáåö
           ListBox1.List(iRow, 0) = iCell.Text
           ListBox1.List(iRow, 2) = iCell.Address
           ListBox1.List(iRow, 1) = iCell(1, 2).Text
           iRow = iRow + 1
        End If
    Next

Вопрос с проверкой ячейки на тип данных открытый. как то не удается приспособить

Visual Basic
1
TypeName(myRangeObj.Cells(1).Value)



0



Hi, I am trying to create a macro that has a loop which copies a function down column 1 (VOL) and another function down column 2 (CAPACITY) for each Station. This is what I have so far:

Sub TieOut()
    Dim i  As Integer
    Dim j As Integer

    For i = 1 To 3
        For j = 1 To 3
            Worksheets("TieOut").Cells(i, j).Value = "'=INDEX('ZaiNet Data'!$A$1:$H$39038,MATCH('INDEX-MATCH'!Z$7&TEXT('INDEX-MATCH'!$A9,"m/dd/yyyy"),'ZaiNet Data'!$C$1:$C$39038,0), 4)"
        Next j
    Next i

End Sub

The picture of what I WANT is below: You can see that I have manually copied and pasted my two functions down each column. I just need a macro that can loop through it.

alt text

The function I want to be looped down the VOL column for each Station is:

=INDEX('ZaiNet Data'!$A$1:$H$39038,MATCH('INDEX-MATCH'!Z$7&TEXT('INDEX-MATCH'!$A438,"M/DD/YYYY"),'ZaiNet Data'!$C$1:$C$39038,0), 4)

The function I want to be looped down the CAPACITY column for each Station is:

=INDEX('ZaiNet Data'!$A$1:$H$39038,MATCH('INDEX-MATCH'!Z$7&TEXT('INDEX-MATCH'!$A438,"M/DD/YYYY"),'ZaiNet Data'!$C$1:$C$39038,0), 5)

Could someone please help? Thank you!

UPDATE

****How can I make the loop run automatically without having to manually enter the formula into the first two cells and click on macro?
Also how can I make the loop run through all the columns/rows? (horizontically)****

I included two screen shots to show what I mean. Below is my current code.
alt text

alt text

Thanks!

    Sub Loop3()
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(-1, 1).Select
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(0, -1).Select

    Dim i  As Integer
    Dim j As Integer
        With Worksheets("Loop")
            i = 1
            Do Until .Cells(10, i).Value = "blank"
                For j = 1 To 10
                    .Cells(j, i).Formula = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!E$7&TEXT(Loop!$A9,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),4)"
                    .Cells(j, i + 1).Formula = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!E$7&TEXT(Loop!$A9,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),5)"
                Next j
                i = i + 2
            Loop
    End With

    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(-1, 1).Select
    Selection.Copy
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
    ActiveCell.Offset(0, -1).Select

End Sub

Понравилась статья? Поделить с друзьями:
  • Перебрать все ячейки excel
  • Перебрать в excel все возможные комбинации
  • Перебор ячейкам excel макрос
  • Перебор ячеек в столбце excel vba
  • Перебор ячеек в excel формула