Цикл по колонкам excel

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

 

Здравствуйте, подскажите, пожалуйста, как можно сделать цикл с перебором столбцов и выход в том случае, если столбец пуст??? То есть можно ли как-то узнать по порядковому номеру столбца его букву??  
Спасибо!

 

Перебор столбцов в использованной области активного листа:  

  For each st in ActiveSheet.UsedRange.Columns  
   Debug.Print st.Column  
Next st  

  перебор с выходом если столбец пуст:  

  For each st in ActiveSheet.UsedRange.Columns  
   If WorksheetFunction.CountA(st) = 0 then    
       Debug.Print st.Column  
       Exit For  
   End if  
Next st  

  перебор с выходом и определением буквы столбца (бесполезная для VBA информация):  

  For Each st In ActiveSheet.UsedRange.Columns  
   If WorksheetFunction.CountA(st) = 0 Then  
       Debug.Print Replace(Split(st.EntireColumn.Address, «:»)(0), «$», «»)  
       Exit For  
   End If  
Next st

 

Спасибо, конечно, но как-то можно проще сделать мне кажется. Сейчас пробую с помощью    

    Worksheets(«Лист1»).Cells(k, I).Value  

  И вот такой вопрос. Поставила условие проверки пустоты ячейки:  

  If IsNull(Worksheets(«Лист1»).Cells(k, I).Value) Then  

  А почему-то если ячейка пустая, то это условие становится в False, хотя должно в True. Можете подсказать почему?  
Впринципе можно использовать IsEmpty…Но это же аналогично..  
И еще почему-то не срабатывает условие  

  If IsDate(Worksheets(«Лист1»).Cells(k, I).Value) Then  

  Не пойму в чем проблема. Подскажите, пожалуйста!!!

 

оно, конечно, аналогично, но не идентично..  
IsNull Function  

          Returns a Boolean value that indicates whether an expression contains no valid data (Null).  

  Syntax  

  IsNull(expression)  

  The required expression argument is a Variant containing a numeric expression or string expression.  

  Remarks  

  IsNull returns True if expression is Null; otherwise, IsNull returns False. If expression consists of more than one variable, Null in any constituent variable causes True to be returned for the entire expression.  

  The Null value indicates that the Variant contains no valid data.    

      Null is not the same as Empty!!!  

    , which indicates that a variable has not yet been initialized. It is also not the same as a zero-length string («»), which is sometimes referred to as a null string.  

  Important   Use the IsNull function to determine whether an expression contains a Null value. Expressions that you might expect to evaluate to True under some circumstances, such as If Var = Null and If Var <> Null, are always False. This is because any expression containing a Null is itself Null and, therefore, False.

 

{quote}{login=slan}{date=29.01.2008 01:20}{thema=}{post}оно, конечно, аналогично, но не идентично..  
IsNull Function{/post}{/quote}  
А если не секрет, откуда такая информация? Я тоже хочу почитать :)  

  И все-таки, а что с IsDate не то?

 

есть такая кнопка… f1 :)

 

{quote}{login=slan}{date=29.01.2008 02:01}{thema=}{post}есть такая кнопка… f1 :){/post}{/quote}  

  Но почему-то у меня меньше там написано :(  
Вопрос с IsDate остался не решен :(

 

Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же IsDate должна проверить и если можно перевести в дату, значит True. Я правильно поняла?

 

{quote}{login=Sonia}{date=29.01.2008 04:19}{thema=}{post}Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же IsDate должна проверить и если можно перевести в дату, значит True. Я правильно поняла?{/post}{/quote}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? «1» в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений  
А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets(«Лист1»).Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.

 

{quote}{login=}{date=29.01.2008 06:55}{thema=Re: }{post}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? «1» в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений  
А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets(«Лист1»).Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.{/post}{/quote}  

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

 

А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил — он все сам нашел.

 

{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил — он все сам нашел.{/post}{/quote}  
Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют

 

{quote}{login=Sonia}{date=30.01.2008 09:39}  
Впринципе можно как-то маску использовать, можете подсказать функцию проверки на сооветствие данных ячейки конкретной маске???{/post}{/quote}  

  может это подойдёт  
If (CStr(Range(«A30»).Offset(0, K)) Like «*.*.*») then  
НомерСтолбцаДаты = K+1  
end if

 

{quote}{login=Sonia}{date=30.01.2008 11:44}{thema=Re: }{post}{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил — он все сам нашел.{/post}{/quote}  
Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют{/post}{/quote}Форма екселевская, в том же файле?  
Может пример прикрепите?

 

{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле?  
Может пример прикрепите?{/post}{/quote}  

  Форма на том же листе. Выкладываю пример.

 

{quote}{login=Sonia}{date=30.01.2008 02:10}{thema=Re: Re: Re: }{post}{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле?  
Может пример прикрепите?{/post}{/quote}  

  Форма на том же листе. Выкладываю пример.{/post}{/quote}  

  А где пример? Почему то не подцепился…

 

Ой, сорри, подцепился. Макрос там же.

 

Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  

    k = 20 ‘ Начало со столбца T  
   Do  
   ‘ Сделано для корректного переноса Примечаний, включающих символ «;»  
     If Worksheets(«Лист1»).Cells(I, k).Value Like «??.??.*» Then  
              Range(«I» + CStr(I)) = Worksheets(«Лист1»).Cells(I, k).Value  
     Else  
        If Not (Worksheets(«Лист1»).Cells(I, k).Value = «») Then  
           Range(«H» + CStr(I)) = Range(«H» + CStr(I)) + «;» + Worksheets(«Лист1»).Cells(I, k).Value  
        End If  
        ‘Range(«I» + CStr(I)) = Worksheets(«Лист1»).Cells(k + 1, I).Value  
     End If  

               ‘Worksheets(«Лист1»).Cells(I, k).Value = Empty  

             k = k + 1  

         Loop Until Worksheets(«Лист1»).Cells(I, k).Value = «»

 

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

  Вопрос Последняя значащая ячейка в строке обязательно дата?  
и кроме нее в обрабатываемом участке строки дат нет?

 

{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
{/post}{/quote}  

  Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами??  

  Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) — дата документа.

 

{quote}{login=ДЛ}  
If Worksheets(«Лист1»).Cells(I, k).Value Like «??.??.*» Then  
{/post}{/quote}  
А разве маска так пишется??? Я думала, что-то типа: «dd.mm.yyyy»??

 

«dd.mm.yyyy» — это формат  
А маска — это определенные символы (в Вашем случае точки) и «?» как любой один символ, а «*» как любые символы.

 

{quote}{login=Sonia}{date=30.01.2008 04:57}{thema=Re: }{post}{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
{/post}{/quote}  

  Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами??  

  Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) — дата документа.{/post}{/quote}  

  Про cells(i,k)  
Пробегите ваш код из редактора VBA Exsel (нажимая F8)  
В окно Watch : View/Watch Window в сплывающем окне по правой  
кнопке мыши добавьте  

   Worksheets(«Лист1»).Cells(I, k).Address  
Worksheets(«Лист1»).Cells(k, I).Address  

  Это адреса ячеек которые вы перебираете, думаю всё станет ясно.  

  Но всё таки поробавпли заменить или нет?  
Если заменили работает?

 

{quote}  
Про cells(i,k)  
Пробегите ваш код из редактора VBA Exsel (нажимая F8)  
В окно Watch : View/Watch Window в сплывающем окне по правой  
кнопке мыши добавьте  

   Worksheets(«Лист1»).Cells(I, k).Address  
Worksheets(«Лист1»).Cells(k, I).Address  

  Это адреса ячеек которые вы перебираете, думаю всё станет ясно.  

  Но всё таки поробавпли заменить или нет?  
Если заменили работает?{/post}{/quote}  

  Да, заменила. Спасибо большое!!!! Все работает!! :) Сейчас еще пошагово пробегусь и Watch посмотрю, чтобы окончательно разобраться ;)

 

{quote}{login=}{date=31.01.2008 07:42}{thema=Re: Re:}{post}  
Worksheets(«Лист1»).Cells(I, k).Address  
{/post}{/quote}  

  Хм…а я считала, что в Cells сначала указывается столбец, а потом строка…оказалось наоборот. Ладно, буду знать :)

 

cross

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

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

Решил что эта тема подходит к моему вопросу.  
Вопрос-    
Как в екселе заменить пустоту «» на null? т.е. есть ячайки без данных но не пустые

 

Вы, видимо, хотите очистить ячейки?  

  if MyCell=»» then MyCell.ClearContents ‘очистить содержимое, сохранить форматирование  

  if MyCell=»» then MyCell.Clear ‘очистить содержимое и форматирование

 

cross

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

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

{quote}{login=Казанский}{date=24.01.2011 11:21}{thema=Cross}{post}Вы, видимо, хотите очистить ячейки?  

  if MyCell=»» then MyCell.ClearContents ‘очистить содержимое, сохранить форматирование  

  if MyCell=»» then MyCell.Clear ‘очистить содержимое и форматирование{/post}{/quote}  
Очень похоже на правду. только не понял как его правильно использывать. через поиск или объявлением таблици. Я в ВБА полный нуб, только осваиваюсь. Начинаю с простого «запись макроса». стоп макрос. потом смотрю код и начинаю его оптимизировать — так и развиваюсь…((

 

Попробуйте — обработка выделенного диапазона, очистка пустых на вид ячеек, которые содержат «» как значение формулы либо полученные копированием-вставкой значения таких ячеек.  
После обработки пустые ячейки выделяются по команде F5 — выделить — пустые ячейки.    

  Sub Cross()  
Dim MyCell As Range  
For Each MyCell In Selection ‘то же, что Selection.Cells  
   If MyCell = «» Then MyCell.ClearContents  
Next ‘ то же, что Next MyCell  
End Sub

 

Юрий М

Модератор

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

Контакты см. в профиле

#30

24.01.2011 12:53:38

{quote}{login=Cross}{date=24.01.2011 11:12}{thema=}{post}Решил что эта тема подходит к моему вопросу. Вопрос- Как в екселе заменить пустоту «» на null? т.е. есть ячайки без данных но не пустые{/post}{/quote}  
Перечитал название темы — «Цикл по перебору столбцов». Что,- действительно подходит?

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

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

For Each element In group

    [ statements ]

    [ Exit For ]

    [ statements ]

Next [ element ]

В квадратных скобках указаны необязательные атрибуты цикла For Each… Next.

Компоненты цикла For Each… Next

Компонент Описание
element Обязательный атрибут в операторе For Each, необязательный атрибут в операторе Next. Представляет из себя переменную, используемую для циклического прохода элементов группы (диапазон, массив, коллекция), которая предварительно должна быть объявлена с соответствующим типом данных*.
group Обязательный атрибут. Группа элементов (диапазон, массив, коллекция), по каждому элементу которой последовательно проходит цикл For Each… Next.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.

*Если цикл For Each… Next используется в VBA Excel для прохождения элементов коллекции (объект Collection) или массива, тогда переменная element должна быть объявлена с типом данных Variant, иначе цикл работать не будет.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For Each… Next

Цикл для диапазона ячеек

На активном листе рабочей книги Excel выделите диапазон ячеек и запустите на выполнение следующую процедуру:

Sub test1()

Dim element As Range, a As String

  a = «Данные, полученные с помощью цикла For Each… Next:»

    For Each element In Selection

      a = a & vbNewLine & «Ячейка « & element.Address & _

      » содержит значение: « & CStr(element.Value)

    Next

  MsgBox a

End Sub

Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.

Цикл для коллекции листов

Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:

Sub test2()

Dim element As Worksheet, a As String

  a = «Список листов, содержащихся в этой книге:»

    For Each element In Worksheets

      a = a & vbNewLine & element.Index _

      & «) « & element.Name

    Next

  MsgBox a

End Sub

Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.

Цикл для массива

Присвоим массиву список наименований животных и в цикле For Each… Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.

Sub test3()

Dim element As Variant, a As String, group As Variant

group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь»)

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

‘рабочего листа, например, выбранного: group = Selection

a = «Массив содержит следующие значения:» & vbNewLine

  For Each element In group

    a = a & vbNewLine & element

  Next

MsgBox a

End Sub

Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.

Sub test4()

Dim element As Variant, a As String, group As Variant

group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь»)

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

‘рабочего листа, например, выделенного: group = Selection

a = «Массив содержит следующие значения:» & vbNewLine

  For Each element In group

    element = «Попугай»

    a = a & vbNewLine & element

  Next

MsgBox a

End Sub

Этот код, как и все остальные в этой статье, тестировался в Excel 2016.

Цикл для коллекции подкаталогов и выход из цикла

В этом примере мы будем добавлять в переменную a названия подкаталогов на диске C вашего компьютера. Когда цикл дойдет до папки Program Files, он добавит в переменную a ее название и сообщение: «Хватит, дальше читать не буду! С уважением, Ваш цикл For Each… Next.».

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Sub test5()

Dim FSO As Object, myFolders As Object, myFolder As Object, a As String

‘Создаем новый FileSystemObject и присваиваем его переменной «FSO»

Set FSO = CreateObject(«Scripting.FileSystemObject»)

‘Извлекаем список подкаталогов на диске «C» и присваиваем

‘его переменной «myFolders»

Set myFolders = FSO.GetFolder(«C:»)

a = «Папки на диске C:» & vbNewLine

‘Проходим циклом по списку подкаталогов и добавляем в переменную «a«

‘их имена, дойдя до папки «Program Files«, выходим из цикла

  For Each myFolder In myFolders.SubFolders

    a = a & vbNewLine & myFolder.Name

    If myFolder.Name = «Program Files» Then

      a = a & vbNewLine & vbNewLine & «Хватит, дальше читать не буду!» _

      & vbNewLine & vbNewLine & «С уважением,» & vbNewLine & _

      «Ваш цикл For Each... Next.«

  Exit For

    End If

  Next

Set FSO = Nothing

MsgBox a

End Sub

Информационное окно MsgBox выведет список наименований подкаталогов на диске C вашего компьютера до папки Program Files включительно и сообщение цикла о прекращении своей работы.

В результате работы программы будут выведены не только наименования подкаталогов, видимых при переходе в проводнике к диску C, но и скрытые и служебные папки. Для просмотра списка всех подкаталогов на диске C, закомментируйте участок кода от If до End If включительно и запустите выполнение процедуры в редакторе VBA Excel.


 
gsvserg
 
(2003-08-07 18:49)
[0]

Нужно в зависимости от длины поля в таблице, которая копируется в Excel, менять column.width в Excel

Что-то типа

for i:=0 to 25 do

if a>b then

worksheet.columns[i].width:=…


 
malamba
 
(2003-08-07 19:10)
[1]

Что за таблица? И что за длина поля?


 
gsvserg
 
(2003-08-07 19:23)
[2]

Таблица AdoQuery, в ней несколько полей. Все поля строковые. Перекидываю ее в Excel. Вычисляю максимальную длину строки в каждом поле, после нужно установить ширину колонок в Excel, чтобы было видно всю строку.


 
Dred2k
 
(2003-08-07 20:16)
[3]

Вот тебе кусок кода.



for j := Low(tmpColNum) to High(tmpColNum) do begin

App.Columns[j + 1].ColumnWidth := FDBGrid.Columns[tmpColNum[j]].Width / 6;

App.Cells[1, j + 1].Value := FDBGrid.Columns[tmpColNum[j]].Title.Caption;

App.Cells[1, j + 1].HorizontalAlignment := DefExcelAlignment[FDBGrid.Columns[tmpColNum[j]].Title.Alignment];

App.Cells[1, j + 1].Font.Bold := True;

App.Cells[1, j + 1].Interior.Color := RGB(192, 192, 192);

App.Cells[1, j + 1].Borders.Color := RGB(0, 0, 0);

(
я поленился, наверное ;)

Вот тебе кусок кода.



for j := Low(tmpColNum) to High(tmpColNum) do begin

App.Columns[j + 1].ColumnWidth := FDBGrid.Columns[tmpColNum[j]].Width / 6;

App.Cells[1, j + 1].Value := FDBGrid.Columns[tmpColNum[j]].Title.Caption;

App.Cells[1, j + 1].HorizontalAlignment := DefExcelAlignment[FDBGrid.Columns[tmpColNum[j]].Title.Alignment];

App.Cells[1, j + 1].Font.Bold := True;

App.Cells[1, j + 1].Interior.Color := RGB(192, 192, 192);

App.Cells[1, j + 1].Borders.Color := RGB(0, 0, 0);

end;

tmpColNum - массив, содержащий номера выводимых мной колоной DBGrid-а. Ширина колонок в Excel выставляется соразмерно ширине колонок грида. Коэффициент соразмерности можно при желании сформулировать и в общем виде (я поленился, наверное ;)).

Кроме ширины выставляются свойства первой строки на листе (заголовок). Лист - текущий.



 
Alex Bredin
 
(2003-08-08 10:44)
[4]

я тож пытался так сделать, но потом сообразил, что Excel сделает это лучше))

//пробуем применить автоформат…

Range1:=Sheet.Range[Sheet.Cells[StartR, StartC],Sheet.Cells[StartR + Rows, StartC + Cols — 1]];

Range1.AutoFormat(XLFormat,True,True,True,True,True,True);

XLFormat-цел.число(я беру 1)-посмотри


 
Alex Bredin
 
(2003-08-08 10:50)
[5]

а вообще над Range можно извращаться как хочешь, только перед этим включи запись макроса, а потом перенеси его текст в Delphi


 
gsvserg
 
(2003-08-08 11:43)
[6]

Alex Bredin © (08.08.03 10:44)

Спасибо, попробовал твой метод — работает.

Только в Excel появляются линии под первой и предпоследней строками. Я так понял что это из-за xlFormat=1.

Всем спасибо.


 
Alex Bredin
 
(2003-08-08 14:53)
[7]

понял ты неправильно.

Цитата из экселевского макроса:

Selection.AutoFormat Format:=xlRangeAutoFormatSimple, Number:=True, Font _

:=True, Alignment:=True, Border:=True, Pattern:=True, Width:=True

думаю все ясно и так


 
gsvserg
 
(2003-08-08 15:35)
[8]

Range1.AutoFormat(1,True,True,true,false,True,True);

thanxxxx


Содержание

  1. Как сделать перебор диапазона ячеек
  2. Как макрос работает
  3. Код макроса
  4. Как этот код работает
  5. Как использовать
  6. Excel функция перебора значений
  7. Excel функция перебора значений
  8. Использование операторов For Each. Next
  9. Проход по диапазону ячеек
  10. Выход из цикла For Each. Next до его завершения
  11. Использование цикла For Each. Next для итерации в классе VBA
  12. См. также
  13. Поддержка и обратная связь

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

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

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

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

Код макроса

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

  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. Введите или вставьте код.

Источник

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

«=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.

Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке.

«=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.

Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке. dog144

Сообщение «=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.

Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке. Автор — dog144
Дата добавления — 14.09.2014 в 18:08

Источник

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

sboy Дата: Понедельник, 10.04.2017, 15:52 | Сообщение № 2
Rafting Дата: Вторник, 11.04.2017, 12:49 | Сообщение № 3
_Boroda_ Дата: Вторник, 11.04.2017, 13:28 | Сообщение № 4
Скажи мне, кудесник, любимец ба’гов.
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Ответить

Gustav Дата: Вторник, 11.04.2017, 13:33 | Сообщение № 5

Да сделайте обыкновенную «таблицу умножения»: в ячейки B1:SF1 с шагом 0,01 протяните 499 значений от 587,01 до 591,99 (колонки), в ячейки A2:A3100 — 3099 значений от 3170,01 до 3200,99. В ячейку B2 — формулу =$A2*B$1 и протяните на весь диапазон B2:SF3100. Дальше обычный Поиск (по Ctrl+F) и ищем значение 1886000.

Показал бы в файле, но файл получился 23 мегабайта. Но в принципе я всё и так рассказал.

P.S. Можно подсветить результаты условным форматированием с формулой: =ЦЕЛОЕ(B2)=1886000 . У меня поиском по кнопке «Найти все» нашлась 51 ячейка (в одной, правда, чуть меньше 1885999,9964, но поскольку отображалась как искомая строка, то тоже поучаствовала). Это было при ширине колонок 80 пикселей. А если увеличить ширину до, скажем, 100 пикселей (при этом в ячейках будут видны 3 знака после запятой), то останутся 50 честных вариантов.

Да сделайте обыкновенную «таблицу умножения»: в ячейки B1:SF1 с шагом 0,01 протяните 499 значений от 587,01 до 591,99 (колонки), в ячейки A2:A3100 — 3099 значений от 3170,01 до 3200,99. В ячейку B2 — формулу =$A2*B$1 и протяните на весь диапазон B2:SF3100. Дальше обычный Поиск (по Ctrl+F) и ищем значение 1886000.

Показал бы в файле, но файл получился 23 мегабайта. Но в принципе я всё и так рассказал.

P.S. Можно подсветить результаты условным форматированием с формулой: =ЦЕЛОЕ(B2)=1886000 . У меня поиском по кнопке «Найти все» нашлась 51 ячейка (в одной, правда, чуть меньше 1885999,9964, но поскольку отображалась как искомая строка, то тоже поучаствовала). Это было при ширине колонок 80 пикселей. А если увеличить ширину до, скажем, 100 пикселей (при этом в ячейках будут видны 3 знака после запятой), то останутся 50 честных вариантов. Gustav

Сообщение Да сделайте обыкновенную «таблицу умножения»: в ячейки B1:SF1 с шагом 0,01 протяните 499 значений от 587,01 до 591,99 (колонки), в ячейки A2:A3100 — 3099 значений от 3170,01 до 3200,99. В ячейку B2 — формулу =$A2*B$1 и протяните на весь диапазон B2:SF3100. Дальше обычный Поиск (по Ctrl+F) и ищем значение 1886000.

Показал бы в файле, но файл получился 23 мегабайта. Но в принципе я всё и так рассказал.

P.S. Можно подсветить результаты условным форматированием с формулой: =ЦЕЛОЕ(B2)=1886000 . У меня поиском по кнопке «Найти все» нашлась 51 ячейка (в одной, правда, чуть меньше 1885999,9964, но поскольку отображалась как искомая строка, то тоже поучаствовала). Это было при ширине колонок 80 пикселей. А если увеличить ширину до, скажем, 100 пикселей (при этом в ячейках будут видны 3 знака после запятой), то останутся 50 честных вариантов. Автор — Gustav
Дата добавления — 11.04.2017 в 13:33

Rafting Дата: Вторник, 11.04.2017, 14:05 | Сообщение № 6

Я уже делал как предлагает Gustav в итоге тратится очень много времени.

Конкретное описание хотелки:

Получаю смету на определенную сумму 1 886 000
Площадь работ по смете 3200 кв.м
Когда заношу данные в электронную систему, система выводит цену за 1 кв.метр равную 1 886 000/3200 = 589,38 (цифра округляется, реальный же результат 589,375. Система выводит значение до сотых) В дальнейшем система начинает ругаться на то что 3200*589,38 не равно 1 886 000. Допустимо менять значения 3200 и 589,38 в небольшом диапазоне. Главное что бы при умножении двух значений получался конкретный результат 1 886 000.
Так как задача регулярная, ищу способ как задать excel цифру которую нужно получить путем умножения числа X на Y. где X — это диапазон значений от 3100,00 до 3300,00 с шагом 0,01 а Y — это диапазон значений от 560,00 до 600,00 с шагом 0,01
Надеюсь понятно объяснил. Заранее благодарю за ответ.

Я уже делал как предлагает Gustav в итоге тратится очень много времени.

Конкретное описание хотелки:

Получаю смету на определенную сумму 1 886 000
Площадь работ по смете 3200 кв.м
Когда заношу данные в электронную систему, система выводит цену за 1 кв.метр равную 1 886 000/3200 = 589,38 (цифра округляется, реальный же результат 589,375. Система выводит значение до сотых) В дальнейшем система начинает ругаться на то что 3200*589,38 не равно 1 886 000. Допустимо менять значения 3200 и 589,38 в небольшом диапазоне. Главное что бы при умножении двух значений получался конкретный результат 1 886 000.
Так как задача регулярная, ищу способ как задать excel цифру которую нужно получить путем умножения числа X на Y. где X — это диапазон значений от 3100,00 до 3300,00 с шагом 0,01 а Y — это диапазон значений от 560,00 до 600,00 с шагом 0,01
Надеюсь понятно объяснил. Заранее благодарю за ответ. Rafting

Сообщение Я уже делал как предлагает Gustav в итоге тратится очень много времени.

Конкретное описание хотелки:

Получаю смету на определенную сумму 1 886 000
Площадь работ по смете 3200 кв.м
Когда заношу данные в электронную систему, система выводит цену за 1 кв.метр равную 1 886 000/3200 = 589,38 (цифра округляется, реальный же результат 589,375. Система выводит значение до сотых) В дальнейшем система начинает ругаться на то что 3200*589,38 не равно 1 886 000. Допустимо менять значения 3200 и 589,38 в небольшом диапазоне. Главное что бы при умножении двух значений получался конкретный результат 1 886 000.
Так как задача регулярная, ищу способ как задать excel цифру которую нужно получить путем умножения числа X на Y. где X — это диапазон значений от 3100,00 до 3300,00 с шагом 0,01 а Y — это диапазон значений от 560,00 до 600,00 с шагом 0,01
Надеюсь понятно объяснил. Заранее благодарю за ответ. Автор — Rafting
Дата добавления — 11.04.2017 в 14:05

Источник

Использование операторов For Each. Next

Операторы For Each. Next повторяют блок операторов для каждого объекта в коллекции или каждого элемента массива. Visual Basic автоматически присваивает переменную при каждом выполнении цикла. Например, следующая процедура добавляет 10 к значению каждой ячейки в диапазоне от A1 до A10.

Указанный ниже код перебирает все элементы массива и устанавливает для каждого из них значение переменной-счетчика I.

Проход по диапазону ячеек

Цикл For Each. Next можно использовать для прохода по диапазону ячеек. Приведенная ниже процедура проходит по диапазону ячеек A1:D10 на листе Sheet1 и присваивает каждой ячейке, абсолютное значение которой меньше 0,01, значение 0 (ноль).

Выход из цикла For Each. Next до его завершения

Из цикла For Each. Next можно выйти с помощью оператора Exit For. Например, при возникновении ошибки можно использовать оператор Exit For в блоке True оператора If. Then. Else или оператора Select Case, который используется непосредственно для проверки ошибок. Если ошибка не возникает, оператор If…Then…Else получает значение False, и цикл продолжает работу.

В следующем примере выполняется поиск первой ячейки диапазона A1:B5, не содержащей число. Если такая ячейка найдена, выводится сообщение и выполняется выход из цикла с помощью оператора Exit For.

Использование цикла For Each. Next для итерации в классе VBA

Для каждого. Следующие циклы не только итерируют массивы и экземпляры объекта Collection . Они также могут выполнять итерацию в созданном вами классе VBA.

Ниже приведен пример, в котором показано, как это сделать.

Создайте модуль класса в редакторе Visual Basic (VBE) и присвойте ему имя CustomCollection. cc1

Вставьте следующий код в только что созданный модуль.

Экспортируйте этот модуль в файл и сохраните его в локальном расположении. cc2

После экспорта модуля откройте экспортированный файл, используя текстовый редактор (программы Блокнот в Windows должно быть достаточно). Содержимое файла должно выглядеть следующим образом.

Используя текстовый редактор, удалите знак ‘ из первой строки под текстом Property Get NewEnum() As IUnknown в файле. Сохраните измененный файл.

В редакторе VBE удалите класс, созданный из проекта VBA, и не экспортируйте его при появлении соответствующего запроса. cc3

Импортируйте файл, из которого вы удалили знак ‘ , назад в VBE. cc4

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

Сноски Описание
[cc1] Вы можете создать модуль класса, выбрав Class Module (Модуль класса) в меню Insert (Вставка). Вы можете переименовать модуль класса, изменив его свойства в окне Properties (Свойства).
[cc2] Вы можете активировать диалоговое окно Экспорт файла, выбрав Export File (Экспорт файла) в меню File (Файл).
[cc3] Вы можете удалить модуль класса из VBE, выбрав Remove Item (Удалить элемент) в меню File (Файл).
[cc4] Вы можете импортировать файл внешнего модуля класса, запустив диалоговое окно Импорт файла (выберите Import File (Импорт файла) в меню File (Файл)).

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Adblock
detector

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