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, я попробовал добавить все в макрос. и вот что получилось. работать не хочет. уже не знаю что делать.

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

Имеются записи (столбец 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

0 / 0 / 0

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

Сообщений: 12

1

30.11.2017, 06:13. Показов 13180. Ответов 6


Студворк — интернет-сервис помощи студентам

Добрый день! Имеется список из 3х столбцов в excel:
Иванов 16 апельсины
Иванов 8 мандарины
Петров 20 мандарины
Федоров 15 апельсины
Федоров 10 яблоки
Федоров 5 мандарины
Каждый день фамилии в разном порядке и разное количество штук, но перечень фруктов всегда один и тот же.
Необходимо копировать данные в таблицу другого формата (перечень фамилий и фруктов во 2й таблице стационарный и всегда один и тот же адрес ячеек), например:
Мандарины. Яблоки. Апельсины
Иванов.
Петров
Трамп
Меркель
Федоров
Подскажите, как сделать перебор строк по условию? Например чтобы из строки Иванов 16 апельсины скопировалось значение 16 в нужную ячейку во вторую таблицу и т.д.



0



11482 / 3773 / 677

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

Сообщений: 11,145

30.11.2017, 06:53

2

Да не собирали эти типы мандарины!

формулой? макросом?
если макросом: считать в массив таблицу.
и каким-нибудь циклом (For-Next, Do-Loop, While-Wend) обработать.
Результаты использовать по назначению: выгрузить на лист, записать в новый файл, вывести в сообщении…



0



es geht mir gut

11264 / 4746 / 1183

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

Сообщений: 11,437

30.11.2017, 07:02

3

Цитата
Сообщение от Alex77755
Посмотреть сообщение

Да не собирали эти типы мандарины!

Их вообще в первой таблице нет. Как они во второй оказались ?



0



0 / 0 / 0

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

Сообщений: 12

30.11.2017, 07:42

 [ТС]

4

Желательно макросом, а может кто-нибудь написать как выглядит код?
Фамилии во 2й таблице могут встречаться которых нет в первой.



0



SoftIce

es geht mir gut

11264 / 4746 / 1183

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

Сообщений: 11,437

30.11.2017, 08:17

5

Цитата
Сообщение от Darlas80
Посмотреть сообщение

кто-нибудь написать как выглядит код?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Darlas()
    Dim Fruit As String, FrsNam As String, i As Long, j As Long, k As Long
    Range("F2:H6").ClearContents
    For j = 6 To 8
        Fruit = LCase(Trim$(Cells(1, j).Value))
        For i = 2 To 6
            FrsNam = LCase(Trim$(Cells(i, 5).Value))
            For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row
                If LCase(Trim$(Cells(k, 1).Value)) = FrsNam And LCase(Trim$(Cells(k, 3).Value)) = Fruit Then
                    Cells(i, j).Value = Val(Cells(k, 2).Value)
                End If
            Next k
        Next i
    Next j
End Sub

Миниатюры

VBA excel перебор строк
 



0



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

30.11.2017, 09:12

6

Darlas80, или так

Visual Basic
1
2
3
4
5
6
7
8
Sub bb()
  With [F2:H6]
                'вставить формулы
    .Formula = "=SUMIFS($B:$B,$A:$A,$E2,$C:$C,F$1)"
                'заменить нули на пусто, заодно заменить формулы на значения
    .Value = Evaluate(Replace("IF(@=0,"""",@)", "@", .Address(, , Application.ReferenceStyle)))
  End With
End Sub



1



0 / 0 / 0

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

Сообщений: 12

04.12.2017, 05:13

 [ТС]

7

SoftIce, не работает(((

Добавлено через 14 минут
Казанский, твой вариант рабочий, спасибо)



0



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

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

 

Ответить

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

Знакомство с объектной моделью 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

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

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

Помогите с макросом (перебор строк)

Автор aleks1982, 21.07.2010, 11:59

« назад — далее »

Печать

Вниз
Страницы1

Действия пользователя


aleks1982

  • *
  • Новичок
  • Сообщения: 2
  • Записан

Помогите с макросом (перебор строк)




21.07.2010, 11:59


Нужно сделать макрос который из каждой строчки таблицы(Лист1) создаёт лист3..n и в этих листах заполняет таблицу(Лист2)
Создание листа сделал, заполнение таблицы тоже сделал, а вот как сделать чтобы макрос каждый раз на строку в низ переходил не могу

ПОМОГИТЕ КТО МОЖЕТ

* 05bc5d78aad82ea2b2c265b5e1f280d00d7cf772.rar

16.42 КБ
скачиваний: 24



Шпец Докапыч

  • *****
  • Ветеран
  • Сообщения: 1,919
  • ОБЛАДАТЕЛЬ УНИКАЛЬНЫХ НАВЫКОВ!!! :)
    1. ICQ - 1686011
  • Расположение: Нижегородская обл., г. Городец
  • Карма: 190
  • Записан

Re: Помогите с макросом (перебор строк)

#1




22.07.2010, 11:04


Переход по строкам делается циклом:

Код Выделить Развернуть

Sub Приложения()
  LR = Sheets("Лист1").[F999].End(xlUp).Row 'посл. строка
  For i = 19 To LR 'перебираем строки
    Sheets("Лист2").Copy After:=Sheets(Sheets.Count)
    ActiveSheet.Name = i
    [A15].FormulaR1C1 = "=Лист1!R[-6]C[11]"
    '... остальные формулы
  Next
End Sub

Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли



aleks1982

  • *
  • Новичок
  • Сообщения: 2
  • Записан

Re: Помогите с макросом (перебор строк)

#2




22.07.2010, 11:10


Благодарствую


Печать

Вверх
Страницы1

Действия пользователя

  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Помогите с макросом (перебор строк)

Действия пользователя

Печать

Top.Mail.Ru

Яндекс.Метрика

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