Excel макросы перебор строки

This is one of those things that I’m sure there’s a built-in function for (and I may well have been told it in the past), but I’m scratching my head to remember it.

How do I loop through each row of a multi-column range using Excel VBA? All the tutorials I’ve been searching up seem only to mention working through a one-dimensional range…

pgSystemTester's user avatar

asked Sep 22, 2009 at 23:53

Margaret's user avatar

1

Dim a As Range, b As Range

Set a = Selection

For Each b In a.Rows
    MsgBox b.Address
Next

Rachel Hettinger's user avatar

answered Sep 23, 2009 at 0:19

Mike's user avatar

MikeMike

2,9751 gold badge18 silver badges14 bronze badges

0

Something like this:

Dim rng As Range
Dim row As Range
Dim cell As Range

Set rng = Range("A1:C2")

For Each row In rng.Rows
  For Each cell in row.Cells
    'Do Something
  Next cell
Next row

Community's user avatar

answered Sep 22, 2009 at 23:58

David Andres's user avatar

David AndresDavid Andres

31.2k7 gold badges45 silver badges36 bronze badges

1

Just stumbled upon this and thought I would suggest my solution. I typically like to use the built in functionality of assigning a range to an multi-dim array (I guess it’s also the JS Programmer in me).

I frequently write code like this:

Sub arrayBuilder()

myarray = Range("A1:D4")

'unlike most VBA Arrays, this array doesn't need to be declared and will be automatically dimensioned

For i = 1 To UBound(myarray)

    For j = 1 To UBound(myarray, 2)

    Debug.Print (myarray(i, j))

    Next j

Next i

End Sub

Assigning ranges to variables is a very powerful way to manipulate data in VBA.

answered Dec 9, 2015 at 1:33

tc_NYC's user avatar

tc_NYCtc_NYC

1921 gold badge2 silver badges11 bronze badges

1

In Loops, I always prefer to use the Cells class, using the R1C1 reference method, like this:

Cells(rr, col).Formula = ...

This allows me to quickly and easily loop over a Range of cells easily:

Dim r As Long
Dim c As Long

c = GetTargetColumn() ' Or you could just set this manually, like: c = 1

With Sheet1 ' <-- You should always qualify a range with a sheet!

    For r = 1 To 10 ' Or 1 To (Ubound(MyListOfStuff) + 1)

        ' Here we're looping over all the cells in rows 1 to 10, in Column "c"
        .Cells(r, c).Value = MyListOfStuff(r)

        '---- or ----

        '...to easily copy from one place to another (even with an offset of rows and columns)
        .Cells(r, c).Value = Sheet2.Cells(r + 3, 17).Value


    Next r

End With

answered Aug 20, 2015 at 16:50

LimaNightHawk's user avatar

LimaNightHawkLimaNightHawk

6,5033 gold badges40 silver badges60 bronze badges

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

 

Добрый день. Нужна помощь в создании макроса, а точнее цикла. Я в этом деле новенький и пока есть проблемы и пробелы в знания. Есть скрипт для  работы в SAP. Его необходимо вставить в макрос и что б макрос по очереди брал данные из строк с листа EXCEL. Я это вижу так. В скрипте есть переменные типа n1.n2.n3.n4….. Все они находятся в первой строке таблицы. Макрос берет скрипт с переменными в первой строке, выполняет все действия из скрипта и переходит к второй строке (переменные стоят в тех же столбцах но на одну строку ниже) берет их, опять вставляет в скрипт и выполняет его. И так весь цикл пока данные не кончатся. Количество строк может меняться. От 200 и до 1000. За любую помощь буду очень благодарен.
И может кто порекомендует хорошие (желательно бесплатные) курсы по VBA ))

 

Roman M

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

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

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

 
Roman M

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

 

Roman M

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

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

Т.е. вам нужен пример скрипта в Excel, который что-то делал бы в SAP?

 

Mershik

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

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

Evgenii Kov, спрошу так ? ЗАЧЕМ ЗДЕСЬ УПОМИНАНИЕ SAP? Вам нужно работа в файле EXCEL?

ЦИКЛЫ ТУТ

если какой-то конкретный вопрос — то ознакомитесь с правилами там есть что почитать (про файл-пример например)

Изменено: Mershik02.10.2020 15:31:26

Не бойтесь совершенства. Вам его не достичь.

 

Roman M, нет. С САПом у меня все нормально. Нужен макрос который будет построчно брать данные с листа экселя (с каждым новым циклом смещаться на одну строку вниз) и подставлять их в скрипт в места где стоят переменные типа n1. n2. n3.  

 

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

Изменено: Evgenii Kov02.10.2020 15:33:41

 

Mershik

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

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

#8

02.10.2020 15:38:33

плохо прочитали там файл-пример, а не Ваш рабочий документ…

Цитата
  2.3. Приложите файл(ы) с примером (общим весом не более 300Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.
   2.4. Не прикладывайте файлы-примеры с персональными данными, конфиденциальной информацией, коммерческой или государственной тайной! Яндекс и Google не спят — проиндексируют ваши данные и привет — они попадут в открытый доступ. И даже удаление темы потом не поможет.

Не бойтесь совершенства. Вам его не достичь.

 

Roman M

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

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

У вас есть скрипт (.vbs ?), который что-то делает и вам в него нужно передать переменные из Excel?

 

Да. и что переменные после каждого цикла брались со следующей строки.  

 

Roman M

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

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

#11

02.10.2020 16:10:18

Будет примерно так

В Excel макрос

Код
Sub tt()
 dim i as long
 dim ScriptObject as object
 dim ScriptProgramm as string
 dim ScriptFile as string
 Set ScriptObject = CreateObject("Wscript.Shell")
 ScriptProgramm = "C:windowssystem32wscript.exe"
 ScriptFile= "путьфайл.vbs" 'здесь указывате путь к вашему vbs файлу. Если в пути есть пробелы, то нужно указать chr(34) & "путьфайл.vbs" & chr(34)
 for i=1 to 10 'цикл с 1 по 10
    ScriptObject.Run ScriptProgramm & " " & ScriptFile & " " & range("A" & i).value & " " & range("B" & i).value, 1, True     'запускаем скрипт с двумя переменными из столбцов А и Б с 1 по 10 строку
 next
 end sub

В скрипте добавляете в начале

Код
p0 = WScript.Arguments(0)
p1=WScript.Arguments(1)

и дальше в скрипте подставляете эти переменные.

К модераторам: тему можно поменять на «Передать циклом переменные в скрипт/vbs»

 
Roman M

спасибо. буду пробовать.
Подскажите., может вы знаете нормальные сайты где можно подтянуть VBA ?
ПС: тему поменяю.

 

Jack Famous

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

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

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#13

02.10.2020 16:55:27

Цитата
Evgenii Kov: нормальные сайты где можно подтянуть VBA

этот

Цитата
Evgenii Kov: тему поменяю

я бы не был так уверен. Поэтому Roman M и обратился к модераторам

По вопросу:

уверены, что хорошая идея передавать из приложения переменные в скриптовый файл? Почему не сделать всё из Excel? Будет и проще, и быстрее, и надёжнее

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Evgenii Kov

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

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

#14

02.10.2020 17:15:01

Jack Famous, у меня все в Excel. есть макрос в который вставлен скрипт. Макрос заходит в САП, идет по шагам скрипта, в нужных шагах вставляет данные с листа Excel (данные расположены в виде строк). Когда скрипт заканчивается он должен вернутся в начало и опять идти по темже шагам скрипта только брать данные из стоки ниже. И так по кругу. Некоторые шаги типа session.findById(«wnd[0]») я заменю на переменные.

Код
Пример того что у меня есть.

Public SapGuiAuto, WScript, msgcol
Public objGui  As GuiApplication
Public objConn As GuiConnection
Public session As GuiSession
Public objSBar As GuiStatusbar
Public objSheet As Worksheet
Public W_System

Function Attach_Session() As Boolean
Dim il, it
Dim W_conn, W_Sess

If W_System = "" Then
   Attach_Session = False
   Exit Function
End If

If Not session Is Nothing Then
    If session.Info.SystemName & session.Info.Client = W_System Then
        Attach_Session = True
        Exit Function
    End If
End If

If objGui Is Nothing Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set objGui = SapGuiAuto.GetScriptingEngine
End If

For il = 0 To objGui.Children.Count - 1
    Set W_conn = objGui.Children(il + 0)
    For it = 0 To W_conn.Children.Count - 1
        Set W_Sess = W_conn.Children(it + 0)
        If W_Sess.Info.SystemName & W_Sess.Info.Client = W_System Then
            Set objConn = objGui.Children(il + 0)
            Set session = objConn.Children(it + 0)
            Exit For
        End If
    Next
Next

If session Is Nothing Then
   MsgBox "Нет активной сессии " + W_System + " с транзакцией " + ", или скрипты недоступны.", vbCritical + vbOKOnly
   Attach_Session = False
   Exit Function
End If

If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject objGui, "on"
End If

Set objSBar = session.findById("wnd[0]/sbar")
session.findById("wnd[0]").maximize
Attach_Session = True

End Function

Public Sub RunGUIScript()

Dim W_Ret As Boolean
' Connect to SAP
W_Ret = Attach_Session
If Not W_Ret Then
    Exit Sub
End If

''ТУТ БУДУТ ОБЪЯВЛЕНЫ ПЕРЕМЕННЫЕ
''Function ProcessRow(iRow)
'Dim m, p, n1, n2, n3, n4, n5, n6, n7
'n1 = Cells(1, 2)
'n2 = Cells(1, 3)
'n3 = Cells(2, 2)
'n4 = Cells(3, 2)
'n5 = Cells(4, 2)
'n6 = Cells(5, 3)
'n7 = Cells(6, 2)
'
'm = 2
'p = Sheets("СТАРТ").Cells(m, 2)
'On Error GoTo myerr

'ТУТ БУДЕТ КОД, СГЕНЕРИРОВАННЫЙ В САП 


session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "FB01"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtBKPF-BUKRS").Text = "1400"
session.findById("wnd[0]/usr/txtBKPF-MONAT").Text = "9"
session.findById("wnd[0]/usr/ctxtBKPF-BLDAT").Text = "11.09.2020"
session.findById("wnd[0]/usr/ctxtBKPF-BLART").Text = "KD"
session.findById("wnd[0]/usr/ctxtBKPF-BUDAT").Text = "11.09.2020"
session.findById("wnd[0]/usr/txtBKPF-BKTXT").Text = "2020-000184344"
session.findById("wnd[0]/usr/ctxtRF05A-NEWBS").Text = "01"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").Text = "1000097845"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").SetFocus
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").caretPosition = 10
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtBSEG-HKONT").Text = "3779010000"
session.findById("wnd[0]/usr/txtBSEG-WRBTR").Text = "48,00"
session.findById("wnd[0]/usr/ctxtBSEG-GSBER").Text = "D400"
session.findById("wnd[0]/usr/txtBSEG-ZUONR").Text = "4200075"
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").Text = "2020-000184344"
session.findById("wnd[0]/usr/ctxtRF05A-NEWBS").Text = "11"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").Text = "1000156406"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").SetFocus
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").caretPosition = 10
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtBSEG-HKONT").Text = "3779890000"
session.findById("wnd[0]/usr/txtBSEG-WRBTR").Text = "48,00"
session.findById("wnd[0]/usr/ctxtBSEG-GSBER").Text = "d407"
session.findById("wnd[0]/usr/txtBSEG-ZUONR").Text = "44002142294"
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").Text = "2020-0001258344"
session.findById("wnd[0]/usr/txtBSEG-ZUONR").SetFocus
session.findById("wnd[0]/usr/txtBSEG-ZUONR").caretPosition = 10
session.findById("wnd[0]/mbar/menu[0]/menu[3]").Select
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[1]/usr/btnSPOP-OPTION1").press


Exit Sub

myerr:
   MsgBox "PEN: произошла ошибка.", vbCritical + vbOKOnly
End Sub


Sub StartExtract()
    
    W_System = "PEN300"
    RunGUIScript
    session.EndTransaction
        
End Sub

Изменено: Evgenii Kov05.10.2020 08:03:51

 

Юрий М

Модератор

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

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

Evgenii Kov, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.

 

Evgenii Kov

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

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

#16

05.10.2020 19:03:14

Roman M, Пожалуйста, подскажите где ошибка ))

Код
Public Sub RunGUIScript()

Dim W_Ret As Boolean
' Connect to SAP
W_Ret = Attach_Session
If Not W_Ret Then
    Exit Sub
End If

''ÒÓÒ ÁÓÄÓÒ ÎÁÚßÂËÅÍÛ ÏÅÐÅÌÅÍÍÛÅ
' Function ProcessRow(iRow)
Dim n1, n2, n3, n4, n5, n6, n7, n8, n9, n10
n1 = Cells(2, 15) 'ìåñÿö ïðîâåäåíèÿ
n2 = Cells(2, 2) 'Äàòà ïåðåðàõóâàííÿ êîøò³â
n3 = Cells(2, 14)
n4 = Cells(2, 12)
n5 = Cells(2, 3) 'Äåáåò
n6 = Cells(2, 10) 'Ñóìà ïåðåðàõóâàííÿ
n7 = Cells(2, 13)
n8 = Cells(2, 5) 'ÁÑ
n9 = Cells(2, 4) 'äîãîâ³ð ç êîíòðàãåíòîì
n10 = Cells(2, 7) 'Êîíòðàãåíò'm = Sheets("ÄÀÍÍÛÅ").Cells(m, p)
p = Sheets("ÄÀÍÍÛÅ").Cells(m, p)

On Error GoTo myerr


'ÒÓÒ ÁÓÄÅÒ ÊÎÄ, ÑÃÅÍÅÐÈÐÎÂÀÍÍÛÉ Â ÑÀÏ

Do While Cells(m, p) <> ""

session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "FB01"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtBKPF-BUKRS").Text = "1400"
session.findById("wnd[0]/usr/txtBKPF-MONAT").Text = n1 'ìåñÿö ïðîâåäåíèÿ
session.findById("wnd[0]/usr/ctxtBKPF-BLDAT").Text = n2 'Äàòà ïåðåðàõóâàííÿ êîøò³â
session.findById("wnd[0]/usr/ctxtBKPF-BLART").Text = "KD"
session.findById("wnd[0]/usr/ctxtBKPF-BUDAT").Text = n2 'Äàòà ïåðåðàõóâàííÿ êîøò³â
session.findById("wnd[0]/usr/txtBKPF-BKTXT").Text = n3
session.findById("wnd[0]/usr/ctxtRF05A-NEWBS").Text = "01"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").Text = n4
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").SetFocus
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").caretPosition = 10
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtBSEG-HKONT").Text = n5 'Äåáåò
session.findById("wnd[0]/usr/txtBSEG-WRBTR").Text = n6 'Ñóìà ïåðåðàõóâàííÿ
session.findById("wnd[0]/usr/ctxtBSEG-GSBER").Text = "D400"
session.findById("wnd[0]/usr/txtBSEG-ZUONR").Text = n7
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").Text = n3
session.findById("wnd[0]/usr/ctxtRF05A-NEWBS").Text = "11"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").Text = n4
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").SetFocus
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").caretPosition = 10
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtBSEG-HKONT").Text = n5 'Äåáåò
session.findById("wnd[0]/usr/txtBSEG-WRBTR").Text = n6 'Ñóìà ïåðåðàõóâàííÿ
session.findById("wnd[0]/usr/ctxtBSEG-GSBER").Text = n8 'ÁÑ
session.findById("wnd[0]/usr/txtBSEG-ZUONR").Text = n9 'äîãîâ³ð ç êîíòðàãåíòîì
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").Text = n3
session.findById("wnd[0]/usr/txtBSEG-ZUONR").SetFocus
session.findById("wnd[0]/usr/txtBSEG-ZUONR").caretPosition = 10
session.findById("wnd[0]/mbar/menu[0]/menu[3]").Select
session.findById("wnd[0]").sendVKey 0
'Äî ýòîãî ìåñòà ãîòîâî. Ñìîòðåòü äàëüøå
session.findById("wnd[0]/usr/sub:SAPMF05A:0700/txtRF05A-AZEI1[1,0]").SetFocus
session.findById("wnd[0]/usr/sub:SAPMF05A:0700/txtRF05A-AZEI1[1,0]").caretPosition = 19
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[1]/usr/txtP_BARCODE").Text = n3
session.findById("wnd[1]/usr/txtP_BARCODE").caretPosition = 14
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/tbar[0]/btn[3]").press
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00025"
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00025"
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "FB05"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/sub:SAPMF05A:0122/radRF05A-XPOS1[3,0]").Select
session.findById("wnd[0]/usr/ctxtBKPF-BLDAT").Text = n2
session.findById("wnd[0]/usr/ctxtBKPF-BLART").Text = "KD"
session.findById("wnd[0]/usr/ctxtBKPF-BUKRS").Text = "1400"
session.findById("wnd[0]/usr/ctxtBKPF-BUDAT").Text = n2
session.findById("wnd[0]/usr/txtBKPF-MONAT").Text = n1 'ìåñÿö ïðîâåäåíèÿ
session.findById("wnd[0]/usr/txtBKPF-BKTXT").Text = n3
session.findById("wnd[0]/usr/txtRF05A-AUGTX").Text = n3
session.findById("wnd[0]/usr/ctxtRF05A-NEWBS").Text = "19"
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").Text = n10 'Êîíòðàãåíò
session.findById("wnd[0]/usr/ctxtRF05A-NEWUM").Text = "H"
session.findById("wnd[0]/usr/ctxtRF05A-NEWUM").SetFocus
session.findById("wnd[0]/usr/ctxtRF05A-NEWUM").caretPosition = 1
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/chkRF05A-XMWST").Selected = True
session.findById("wnd[0]/usr/txtBSEG-WRBTR").Text = n6 'Ñóìà ïåðåðàõóâàííÿ
session.findById("wnd[0]/usr/ctxtBSEG-MWSKZ").Text = "I2"
session.findById("wnd[0]/usr/ctxtBSEG-GSBER").Text = n8 'ÁÑ
session.findById("wnd[0]/usr/txtBSEG-ZUONR").Text = n9 'äîãîâ³ð ç êîíòðàãåíòîì
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").Text = n3
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").SetFocus
session.findById("wnd[0]/usr/ctxtBSEG-SGTXT").caretPosition = 14
session.findById("wnd[0]/tbar[1]/btn[16]").press
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtRF05A-AGKON").Text = n10 'Êîíòðàãåíò
session.findById("wnd[0]/usr/ctxtRF05A-AGUMS").Text = "ABCDEFGHIJKLMNOPQVXZ"
session.findById("wnd[0]/usr/ctxtRF05A-AGUMS").SetFocus
session.findById("wnd[0]/usr/ctxtRF05A-AGUMS").caretPosition = 20
session.findById("wnd[0]/tbar[1]/btn[16]").press
session.findById("wnd[0]/usr/tabsTS/tabpPART").Select
'Äî ýòîãî ìåñòà ãîòîâî. Ñìîòðåòü äàëüøå
session.findById("wnd[0]/usr/tabsTS/tabpPART/ssubPAGE:SAPDF05X:6104/tblSAPDF05XTC_6104/txtDF05B-PSBET[7,1]").SetFocus
session.findById("wnd[0]/usr/tabsTS/tabpPART/ssubPAGE:SAPDF05X:6104/tblSAPDF05XTC_6104/txtDF05B-PSBET[7,1]").caretPosition = 8
session.findById("wnd[0]").sendVKey 2
session.findById("wnd[0]/usr/tabsTS/tabpPART/ssubPAGE:SAPDF05X:6104/tblSAPDF05XTC_6104").Columns.elementAt(7).Width = 15
session.findById("wnd[0]/mbar/menu[0]/menu[1]").Select
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/sub:SAPMF05A:0700/txtRF05A-AZEI1[7,0]").SetFocus
session.findById("wnd[0]/usr/sub:SAPMF05A:0700/txtRF05A-AZEI1[7,0]").caretPosition = 0
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[1]/usr/txtP_BARCODE").Text = n3
session.findById("wnd[1]/usr/txtP_BARCODE").caretPosition = 14
session.findById("wnd[1]/tbar[0]/btn[0]").press


m = Sheets("ÄÀÍÍÛÅ").Cells(m, p) + 1
p = Sheets("ÄÀÍÍÛÅ").Cells(m, p) + 1

Loop

Exit Sub

myerr:
   MsgBox "PEN: ïðîèçîøëà îøèáêà.", vbCritical + vbOKOnly
End Sub
 

Evgenii Kov

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

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

#17

05.10.2020 19:06:45

Jack Famous, я попробовал добавить все в макрос. и вот что получилось. работать не хочет. уже не знаю что делать.

Перебор строк по условию с помощью цикла (макрос)

koshelevdmitry

Дата: Четверг, 17.01.2013, 14:48 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Добрый день! На работе попросили переделать Excel файл (Более 20 000 строк).
Необходимо перебрать даты, чтобы получилось как в примере во вложении.

Суть задачи:
Есть клиенты с датой подключения к услуге и датой отключения от услуги. Необходимо сравнивая эти даты копировать строки ниже просматриваемой строки, либо переходить к следующей.

Возьмем 2 даты:
01.01.2012 — 25.04.2012

Необходимо получить:

01.01.2012 — «-»
01.02.2012 — «-»
01.03.2012 — «-»
01.04.2012 — 25.04.2012

Условие для перехода:

Если ДатаКонец=»-«, тогда ДатаРезультат = «-» и переход к след. строчке. Иначе выполняем условие:

ДатаРезультат = «-» и

Если ДатаНачала<ДатаКонец, тогда необходимо добавить строку ниже и скопировать все содержимое строки изменив в ДатаНачало = Добавить 1 месяц к ДатеНачало.

Как только дата датаНачало>ДатыКонец, переход к след строке и все по новой.

Очень надеюсь на вашу помощь!!! А, то вручную это не реально сделать((( А с VBA вообще не знаю как работать.

К сообщению приложен файл:

___.xls
(29.0 Kb)

Сообщение отредактировал koshelevdmitryЧетверг, 17.01.2013, 14:49

 

Ответить

nerv

Дата: Четверг, 17.01.2013, 15:25 |
Сообщение № 2

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

очень похоже на тему для раздела работа


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

koshelevdmitry

Дата: Четверг, 17.01.2013, 15:40 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Я прошу о помощи, а не хочу нанимать людей.
Сейчас пытаюсь сам разобраться с макросами. Но увы я не ахти какой программер. Поэтому и пишу сюда…

 

Ответить

nerv

Дата: Четверг, 17.01.2013, 16:19 |
Сообщение № 4

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Цитата (koshelevdmitry)

Я прошу о помощи, а не хочу нанимать людей.

Вы просите сделать за Вас работу (на мой взгляд)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

AlexM

Дата: Четверг, 17.01.2013, 19:20 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4257


Репутация:

1046

±

Замечаний:
0% ±


Excel 2003

Код макроса
[vba]

Код

Sub Macros()
Application.ScreenUpdating = False
iRow = 2
While Range(«A» & iRow) <> «»
      If Range(«F» & iRow) = «-» Then Range(«G» & iRow) = «-»
      If Range(«F» & iRow) <> «-» Then
          While Range(«F» & iRow) — DateSerial(Year(Range(«E» & iRow)), Month(Range(«E» & iRow)) + 1, Day(Range(«E» & iRow))) > 0
              Rows(iRow).Copy: Rows(iRow + 1).Insert Shift:=xlDown: Application.CutCopyMode = False
              Range(«G» & iRow) = «-»
              Range(«E» & iRow + 1) = DateSerial(Year(Range(«E» & iRow)), Month(Range(«E» & iRow)) + 1, Day(Range(«E» & iRow)))
              Range(«A» & iRow) = iRow — 1
              Range(«A» & iRow + 1) = iRow
              iRow = iRow + 1
          Wend
          Range(«G» & iRow) = Range(«F» & iRow)
      End If
Range(«A» & iRow) = iRow — 1
iRow = iRow + 1
Wend
Application.ScreenUpdating = True
End Sub

[/vba]
См. файл.

PS. Оптимизацией кода заниматься некогда, сегодня погода и лыжня классная. smile



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.

Сообщение отредактировал AlexMЧетверг, 17.01.2013, 19:42

 

Ответить

nimr

Дата: Воскресенье, 11.02.2018, 18:44 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

AlexM, Здравствуйте. AlexM, Разбираю (я взрослый неофит 100%. вчера зарегистрировался) ваш код по частям, так как столкнулся (по работеучёбе) с более-менее похожей задачей. Мне подходит, короче.
Несложно ли вам будет ответить на вопрос о втором цикле — как можно неравенство написать так, что типы разные, и чтоб всё это ещё и работало?
Почему спрашиваю. Ежемесячно получаю файл Excel. Страшно взглянуть. Дизайн я подправил встроенным VB (сделал в макросе). А теперь есть необходимость сделать цикл чтения ячеек (первая дата всегда в определённой ячейке) в столбце дат, который прерывается при нахождении другой (следующей, большей) даты, чтобы передать управление процедуре суммирования цифр в соседнем столбце (идущие параллельно — напротив дат, которые цикл уже исследовал). И так далее, до конца столбца.
Такая проблема. Мне не нужно, чтобы вы за меня всё сделали, как koshelevdmitry в Четверг, 17.01.2013, 19:20. (так круто, так изящно, так кратко! чисто ассемблерный от Нортона — как «по железу» почти блин! ни дать , ни взять… без лести и сарказма говорю… пусть все знают). Дайте направление. Справлюсь. Попробую справиться. Пожалуйста. Научите HOW. А то я даже не знаю как номер ячейке присвоить — вручную пишу.
И ещё. Перед завершениемв начале кода строка (скринАпдейтин тру и фэлс) — почему? (транслитерирую, чтобы админ не ругался)
Файл не прикрепил(ся)

К сообщению приложен файл:

7304206.xls
(20.0 Kb)

Сообщение отредактировал nimrВоскресенье, 11.02.2018, 18:47

 

Ответить

Pelena

Дата: Воскресенье, 11.02.2018, 18:51 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

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


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

nimr

Дата: Воскресенье, 11.02.2018, 18:59 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Pelena, Прочитал. Сделаю по правилам. Спасибо.
upd 20:04 Почитал темы. Пока не нашёл. Отдохну немного и создам новую тему. Ещё раз спасибо.

Сообщение отредактировал nimrВоскресенье, 11.02.2018, 20:05

 

Ответить

nimr

Дата: Понедельник, 12.02.2018, 22:11 |
Сообщение № 9

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Pelena, c решением помог sboy. Надо ли объявлять каким-то образом о закрытии темы?
[moder]Не надо[/moder]

Сообщение отредактировал PelenaВторник, 13.02.2018, 08:34

 

Ответить

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

Имеются записи (столбец E)

Source
69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-3(RX1)-1
69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-4(RX2)-1
HMS8097-SRG-HMS8097_663-1.3/10M565-OSN8800-1-shelf0-1-13LQM-3(RX1)-1
EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-1-13LQM-3(RX1)-1
EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-11-13LQM-3(RX1)-1

В столбец D необходимо записать значение из массива (TQX, LQM и так далее) если строка содержит элемент массива.

Не могу понять, как написать цикл, чтобы он перебирал все строки в столбце E и искал в них один из элементов массива.
При нахождении элемента в ячейку D заносил найденый элемент массива. Ну и при отсутствии такового записывал в ячейку D пометку, что нет совпадений.

D: E:
TQX 69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-3(RX1)-1
TQX 69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-4(RX2)-1
LQM HMS8097-SRG-HMS8097_663-1.3/10M565-OSN8800-1-shelf0-1-13LQM-3(RX1)-1
LQM EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-1-13LQM-3(RX1)-1
LQM EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-11-13LQM-3(RX1)-1

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Arr()

Sheets(«DATA»).Select
Range(«E1»).Select
Selection.CurrentRegion.Select
KolStpData = Selection.Rows.Count ‘количество строк.

Dim myArray As Variant
Dim txt As String
Dim i As Long

myArray = Array(«TQX», «NS3», «LQM», «ND2», «LDG», «LBES», «FDGS», «TMRS», «TRC», «LWC», «LBE», «NS2», «TOM», «TDX», «LWX», «LDM»)
Range(«D2»).Select

For i = 1 To KolStpData — 1

Dim sStr As String
sStr = myArray(0)
pStr = Range(«E» & i + 1)
If InStr(1, pStr, sStr, vbTextCompare) > 0 Then
ActiveCell.FormulaR1C1 = myArray(0)
Else
ActiveCell.FormulaR1C1 = «———-!»
End If
ActiveCell.Offset(1, 0).Select
Next

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

Имеются записи (столбец E)

Source
69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-3(RX1)-1
69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-4(RX2)-1
HMS8097-SRG-HMS8097_663-1.3/10M565-OSN8800-1-shelf0-1-13LQM-3(RX1)-1
EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-1-13LQM-3(RX1)-1
EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-11-13LQM-3(RX1)-1

В столбец D необходимо записать значение из массива (TQX, LQM и так далее) если строка содержит элемент массива.

Не могу понять, как написать цикл, чтобы он перебирал все строки в столбце E и искал в них один из элементов массива.
При нахождении элемента в ячейку D заносил найденый элемент массива. Ну и при отсутствии такового записывал в ячейку D пометку, что нет совпадений.

D: E:
TQX 69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-3(RX1)-1
TQX 69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-4(RX2)-1
LQM HMS8097-SRG-HMS8097_663-1.3/10M565-OSN8800-1-shelf0-1-13LQM-3(RX1)-1
LQM EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-1-13LQM-3(RX1)-1
LQM EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-11-13LQM-3(RX1)-1

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Arr()

Sheets(«DATA»).Select
Range(«E1»).Select
Selection.CurrentRegion.Select
KolStpData = Selection.Rows.Count ‘количество строк.

Dim myArray As Variant
Dim txt As String
Dim i As Long

myArray = Array(«TQX», «NS3», «LQM», «ND2», «LDG», «LBES», «FDGS», «TMRS», «TRC», «LWC», «LBE», «NS2», «TOM», «TDX», «LWX», «LDM»)
Range(«D2»).Select

For i = 1 To KolStpData — 1

Dim sStr As String
sStr = myArray(0)
pStr = Range(«E» & i + 1)
If InStr(1, pStr, sStr, vbTextCompare) > 0 Then
ActiveCell.FormulaR1C1 = myArray(0)
Else
ActiveCell.FormulaR1C1 = «———-!»
End If
ActiveCell.Offset(1, 0).Select
Next

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

Имеются записи (столбец E)

Source
69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-3(RX1)-1
69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-4(RX2)-1
HMS8097-SRG-HMS8097_663-1.3/10M565-OSN8800-1-shelf0-1-13LQM-3(RX1)-1
EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-1-13LQM-3(RX1)-1
EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-11-13LQM-3(RX1)-1

В столбец D необходимо записать значение из массива (TQX, LQM и так далее) если строка содержит элемент массива.

Не могу понять, как написать цикл, чтобы он перебирал все строки в столбце E и искал в них один из элементов массива.
При нахождении элемента в ячейку D заносил найденый элемент массива. Ну и при отсутствии такового записывал в ячейку D пометку, что нет совпадений.

D: E:
TQX 69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-3(RX1)-1
TQX 69Ekat-EKT104Z_653-M516-OSN8800 Asbestovsky-shelf0-14-52TQX-4(RX2)-1
LQM HMS8097-SRG-HMS8097_663-1.3/10M565-OSN8800-1-shelf0-1-13LQM-3(RX1)-1
LQM EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-1-13LQM-3(RX1)-1
LQM EKT9044-Tuglm-EKT9044_652-8.3M533-OSN-6800-3-shelf0-11-13LQM-3(RX1)-1

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Arr()

Sheets(«DATA»).Select
Range(«E1»).Select
Selection.CurrentRegion.Select
KolStpData = Selection.Rows.Count ‘количество строк.

Dim myArray As Variant
Dim txt As String
Dim i As Long

myArray = Array(«TQX», «NS3», «LQM», «ND2», «LDG», «LBES», «FDGS», «TMRS», «TRC», «LWC», «LBE», «NS2», «TOM», «TDX», «LWX», «LDM»)
Range(«D2»).Select

Источник

VBA Excel. Цикл For Each… Next

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

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

Синтаксис цикла For Each… Next

В квадратных скобках указаны необязательные атрибуты цикла 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 выделите диапазон ячеек и запустите на выполнение следующую процедуру:

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

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

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

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

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

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

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

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

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

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

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

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

46 комментариев для “VBA Excel. Цикл For Each… Next”

Здравствуйте!
Я новичок в VBA, поэтому ,возможно, вопрос глупый, но не могу никак придумать процедуру для сравнения двух массивов с помощью цикла For Each… Next.
т.е. имеются столбцы A:B — ФИО1 Дата1 и столбцы C:D — ФИО2 Дата2. Хочу сравнить и при совпадении выделить совпадающие ячейки цветом.
Подскажите, хотя бы примерно, как это сделать.
Спасибо

Здравствуйте!
Диапазоны в примере одинаковые по размеру, но могут быть любые:

Спасибо большое, Евгений!
Я немного неправильно сформулировал.
Нужно выделить, если пары ФИО и Дата совпадают.
т.е. Иванов 1979 и Иванов 1979 выделялись, а Иванов 1979 и Иванов 1980 нет. Так же как и Иванов 1979 и Петров 1979 не нужно выделять.
Пока придумал только если создать дополнительные столбцы и в них прописать «=A1&B1» и по ним сравнивать.
Можно ли как то сделать по другому?

Можно и по-другому, попробуйте так:

Спасибо огромное. То, что нужно!

Добрый день.
Есть задача посложнее.
Лист 1 . А1 инвентарный номер (10 или 12 знаков) . В1 колличество полученных деталей.
Лист 2 . Колонка J содержит инвентарный номер (может быть несколько строк). Колонка S содержит текст внутри которого колличество полученных деталей (B1 листа 1). Колонка N содержит дату получения деталей.
Задача надо найти по данным Листа1 совпадение А1&В1 на Листе 2 данные колонки n

Здравствуйте!
Подскажите пожалуйста, как с помощью цикла For Each…Next можно выполнить задачу:
Есть диапазон со значениями, например («B1:С5»)
Нужно все значения из этого диапазона последовательно вынести в столбец A (раздельно, не в одну ячейку)

Большое спасибо!
У вас очень классный сайт, существенно мне помог разобраться в VBA Excel

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

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

Найденные числа записываются в первый столбец листа «Лист1». Пустые ячейки (нули) игнорируются.

Правильно ли будет отрабатываться условие «если такой цифры с противоположным знаком нет -> (то вывести в столбик такие цифры, к которым нет противоположных)» во втором цикле? Будет ложное срабатывание, когда val1=5 и val2=6, например, ведь 5<>-6.

проверяет, с какими значениями переменных закончился внутренний цикл. Если это 5 и 6, значит в массиве нет значения -5, и это не ложное, а верное срабатывание.

Добрый вечер! Подскажите, пожалуйста, как исправить проблему? Дана строка символов, и нужно определить, встречаются ли в ней 5 символов «$» и 3 символа «%»? Почему-то в любом случае результат, что «Символы не встречаются». Заранее спасибо.

Дарья, объявление переменных

А код измените следующим образом:

Здравствуйте.
Подскажите, пожалуйста, как выполнить задачу. Есть лист1. В нем столбик А с ячейками ID(заранее известно количество строк). Нужно сравнить с ячейками ID столбика А листа2 и при совпадении записать данные из столбика К листа1 в столбик D листа2 вместе с цветом ячейки. В листе2 не известно заранее сколько строк. Я написала начало, дальше не пойму как.

Здравствуйте, Елена!
Как я понял из вашего кода, просмотр начинается с 3 строки. Вот два варианта решения, где вам нужно только заменить Лист11 на Worksheets(«22.11-28.11») и Лист12 на второй ваш лист:

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

Только это не работает.

Елена, вы правильно написали, надо добавить именно эту строку, и она работает — только что проверил. Может быть, вы в ней не поменяли названия листов?

Да работает. Просто цвета, созданные условным форматированием, не переносятся

Результат не гарантирован, так как он будет зависеть от формулировок правил условного форматирования.

Как-то частично переносит цвет.
Заметила, что и на первом листе и на втором игнорируется последняя строка. Поставила n1 + 1, n2 + 1 и все работает как надо.

Подскажите, пожалуйста,как обозначить выполнение цикла операций после проведения отбора каждого из возможных значений по одному из столбцов?
Есть массив данных(много столбцов) с разными значениями в ячейках столбца День(от 1до 31). Нужно последовательно для каждого дня вывести массив, скопировать его (отдельные части) и перенести в другую книгу. Так для каждого дня. Т.е последовательно скопировать и вставить массивы данных в другую книгу. В общем массиве могут быть не все даты месяца.

Подскажите пожалуйста есть ли способ с помощью этого цикла перекрасить объекты (Shape) имеющие в себе гиперссылки (Hyperlink) во всей книге.
Для листа у меня вышло а для книги не могу понять как, прошу помощи так как только начал разбираться в vba.
Код макроса.

Здравствуйте, Денис!
Ваш код для всей текущей книги:

Здравствуйте. А как быть, если выбраны пользователем несмежные ячейки? Перебор не идёт (

Здравствуйте, Владимир!
У меня цикл For Each… Next работает и с выбранными несмежными ячейками — Selection , и с заданными как объект Range — Range(«B4:B5,D7:D8,G1:G2») . Проверьте у себя еще раз на примере цикла для диапазона ячеек (test1).

Здравствуйте.
Я инженер, работаю со сметами. У нас разделы в смете, и после каждого раздела нужна подсчитать итог, разделы начинаются : » РАЗДЕЛ «НОМЕР» ****** » . У меня не получается никак. Подскажите пожалуйста.

Здравствуйте, Андрей!
Недостаточно информации для понимания ситуации. Объясните структуру сметы: в каком столбце находятся названия разделов, какие диапазоны надо суммировать, куда записывается результат суммирования.

Таблица в столбцах A:H. Раздел находится в столбцах B:F (одна строка) мне нужно суммировать столбец H от первого раздела до следующего раздела ( все разделы по отдельности). Вверху раздела одна пустая строка, там должно вписаться результат суммы раздела в столбце H. Все разделы должны по отдельности суммироваться.

По вашему описанию я представляю так:

Сстрока 1 — шапка таблицы.

Блок раздела 1:
ячейка B2 — наименование раздела (РАЗДЕЛ 1)
диапазон H3-H8 — диапазон суммирования
ячейка H9 — сумма

Блок раздела 2:
ячейка B10 — наименование раздела (РАЗДЕЛ 2)
диапазон H11-H20 — диапазон суммирования
ячейка H21 — сумма

и так далее (диапазон суммирования — величина переменная). Правильно?

Да. Но разделы не «B2» а «B2:F2» то есть они объединены в одну строку (столбцы). Разделы начинаются со слова , например «Раздел 1. Кровля» , то есть разделы начинается : «Раздел «номер» «****» . и т.д. Мне нужно пробегаться по этим разделам и вставить итог в конце. Остальное все правильно.

Андрей, в объединенной ячейке отображается только значение первой ячейки, поэтому обращаться к объединенной ячейке «B2:F2» будем «B2» . Код будет работать при отсутствии пустых ячеек внутри суммируемых диапазонов, нули допускаются:

Привет, Евгений. Ну я вписал, не работает, только n подсчитывает последнюю строку. Сумма в столбце H не вставляется, m тоже не работает.

Андрей, у меня все работает. Возможно, у вас структура таблицы другая.

В строке раздела в столбце «H» пусто.
Структура:
В 1 столбце нумерация.
В 2ом обоснование.
В 3ем наименование.
В 4ем ед.измерение.
В 5ом норма.
В 6ом по проекту.
В 7ом цена
В 8ом сумма.

Если на пересечении строки раздела и столбца «H» пусто, тогда:

Привет Евгений. Можно функцию сумм как формулу ввести, чтобы в ячейке была формула?

Можно и формулу вставить:

Спасибо Евгений, удачи тебе, очень помог.

Здравствуйте, по работе нужно модернизировать существующий макрос, чтобы он для ячеек из диапазона столбцов от G до N заполнял пустые ячейки прочерками «-«, как я полагаю, используя For Each, можете помочь?

Источник

Adblock
detector

Понравилась статья? Поделить с друзьями:
  • Excel макросы оператор for
  • Excel макросы найти ячейку
  • Excel макрос экспорт в pdf
  • Excel макрос что такое value
  • Excel макрос число пропись