简体   繁体   English

Excel VBA复制和粘贴循环内的循环

[英]Excel VBA Copy and Paste Loop within Loop

I've been working on this VBA code for a while and since I'm a complete noob I feel like I haven't gotten anywhere. 我已经在VBA代码上工作了一段时间了,由于我是一个完整的菜鸟,所以我觉得自己什么都没得到。 I've been researching a ton, but can't seem to combine answers to help with my scenario. 我一直在研究大量内容,但似乎无法结合答案来帮助解决我的情况。

Essentially what I'm trying to do is grab data, line by line, from one worksheet and extrapolate it to another worksheet. 本质上,我想做的是从一个工作表中逐行获取数据,并将其外推到另一个工作表。 I believe this will involve loops and I'm so new with VBA I don't know how to do it. 我相信这会涉及循环,而我对VBA还是很陌生,我不知道该怎么做。

Here's the logic I'm attempting: For each row on worksheet 1, I would like to perform 3 different copy and paste activities to worksheet 2 and then it will loop down to the next row on sheet1 and do the 3 activities and so on. 这是我尝试的逻辑:对于工作表1的每一行,我想对工作表2执行3种不同的复制和粘贴活动,然后它将循环到sheet1的下一行并执行这3项活动,依此类推。 This will continue downwards until column A is blank in sheet1. 这将继续向下,直到工作表1中的A列为空白。 Sheet1 data starts at A3 and sheets2 paste area starts at A2. Sheet1数据从A3开始,Sheets2粘贴区域从A2开始。

The first activity is to copy cells F3,D3,A3, and H3 (in that order so F3 will be A2, D3 will be B2 etc) from sheet 1 to sheet 2 to A2,B2,C2, etc. A destination functions can't be used because I need just the values and no other formats—one of the many issues I've ran in to. 第一个活动是将单元格F3,D3,A3和H3(以此顺序将F3复制为A2,D3为B2等)从工作表1复制到工作表2,再复制到A2,B2,C2等。目标函数可以不会被使用,因为我只需要值而无需其他格式,这是我遇到的许多问题之一。

The next activity is to copy cells F3,D3,A3 and I3 from sheet 1 to sheet2 pasted below the previous copy and paste—again no formats just values. 下一个活动是将单元格F3,D3,A3和I3从工作表1复制到粘贴在先前复制下面的工作表2,然后粘贴-同样,没有格式只是值。 Also to note, some of these may be blank (except A column) but I still need that row there with at least column A data—this goes to say with all these activities. 还要注意,其中一些可能为空(A列除外),但是我仍然需要至少包含A列数据的那一行-包括所有这些活动。

The third activity is to copy and paste sheet1's F3,D3, and A3 a certain number of times referencing K3's number—and each copy and paste will be in the next available blank cell. 第三个活动是将工作表1的F3,D3和A3复制并粘贴一定的次数(参考K3的编号),并且每次复制和粘贴都将在下一个可用的空白单元格中。 So if the number in K3 it will look like it created 3 rows in sheet2—totaling 5 rows on sheet2 since activity1 and 2 each create their own row. 因此,如果K3中的数字看起来像是在sheet2中创建了3行-由于activity1和2各自创建了自己的行,因此在sheet2上总共添加了5行。

After these three activities are completed for row 3 on sheet 1, it will then move to row 4 and do the previous three activities and paste to sheet2. 在工作表1的第3行完成这三个活动之后,它将移至行4并执行前面的三个活动并粘贴到工作表2。 And again it will be pasting no formats and in the next blank row on sheet 2. Also again, this loop will stop once the cell in Column A is blank. 再一次,它将不粘贴任何格式,并粘贴在工作表2的下一个空白行中。同样,一旦列A中的单元格为空白,此循环将停止。

Below is my incomplete code. 下面是我不完整的代码。 I don't even think it will help one bit and it would probably be better not to even look at it. 我什至不认为这会有所帮助,甚至最好不要看它。 I've just started to get frustrated since I can't even do a simple copy and paste, yet alone loops within loops. 因为我什至无法进行简单的复制和粘贴,但是在循环中独自循环,我才开始感到沮丧。 I also haven't even started on my third activity. 我什至还没有开始我的第三项活动。 I greatly appreciate it! 我非常感谢!

Sub copyTest3()

Dim proj As Range, release As Range, pm As Range, lead As Range, coord As Range
Dim leadCopy As Range, coordCopy As Range
Dim i As Range

Set proj = Range("A3", Range("A3").End(xlDown))
Set release = Range("D3", Range("D3").End(xlDown))
Set pm = Range("F3", Range("F3").End(xlDown))
Set lead = Range("H3", Range("H3").End(xlDown))
Set coord = Range("I3", Range("I3").End(xlDown))

Set leadCopy = Union(pm, release, proj, lead)
Set coordCopy = Union(pm, release, proj, coord)


For i = 1 To Range(ActiveSheet.Range("A3"), ActiveSheet.Range("A3").End(xlDown))
    leadCopy.Copy
    Sheets("Sheet2").Activate
    Range("A2").Select
    ActiveSheet.PasteSpecial xlPasteValues

    Application.CutCopyMode = False

    Sheets("Sheet1").Activate
    coordCopy.Copy
    Sheets("Sheet2").Activate
    Range("A2").Select
    ActiveSheet.PasteSpecial xlPasteValues

Next i

End Sub

The way I usually approach copying data between sheets in Excel is to create source range and destination range objects, each range referring to just one row. 我通常在Excel中的工作表之间复制数据的方法是创建源范围和目标范围对象,每个范围仅引用一行。 When I want to move on to the next row, I use Offset to return a range offset to the next row. 当我想移至下一行时,我使用Offset将范围偏移返回到下一行。

Since the ranges only refer to one row, you can index them with an integer to get the cells in the row. 由于范围仅引用一行,因此您可以使用整数对它们进行索引以获取该行中的单元格。 Eg if cursor refers to columns A through D in row 3, cursor(3) will give you the cell C3. 例如,如果cursor指向第3行的A到D列, cursor(3)将为您提供单元格C3。

Dim src_cursor As Range
Dim dest_cursor As Range

Set src_cursor = ActiveSheet.Range("A3:I3")
Set dest_cursor = Sheets("Sheet2").Range("A2:D2")

'' Loop until column A is empty in source data
Do Until IsEmpty(src_cursor(1))
    dest_cursor(1) = src_cursor(6) '' copy F -> A
    dest_cursor(2) = src_cursor(4) '' copy D -> B
    '' and so on

    '' move cursors to next row
    Set src_cursor = src_cursor.Offset(1, 0)
    Set dest_cursor = dest_cursor.Offset(1, 0)
Loop

Also, this might be getting a little off topic, but it's a better practice to use an Enum to name the column numbers instead of hardcoding them like I did here. 同样,这可能会有些偏离主题,但是最好使用Enum命名列号,而不是像我在此处那样对其进行硬编码。

There are many ways to do this, and some are more efficient than others. 有许多方法可以做到这一点,有些方法比其他方法更有效。 My solution may not be the most efficient, but hopefully it will be easy for you to understand so that you can learn. 我的解决方案可能不是最有效的,但是希望您可以轻松理解它,以便您学习。

It's very difficult to understand what you're attempting to do in activity three, so I wasn't able to provide a solution to that step. 很难理解您在活动三中要做什么,因此我无法为该步骤提供解决方案。 Use my code as a template for step three and if you run into issues, feel free to leave a comment. 将我的代码用作第三步的模板,如果遇到问题,请随时发表评论。

Notice that I don't use .Activate , .Select , or .Copy in this code. 注意,在此代码中我没有使用.Activate.Select.Copy .Activate and .Select are huge efficiency killers, and they make it easier for your code to "break," so avoid using them when possible. .Activate.Select是巨大的效率杀手,它们使您的代码更容易“破坏”,因此请尽可能避免使用它们。 .Copy isn't necessary when working with values or formulas and will also slow your code down. .Copy在使用值或公式时不是必需的,并且还会降低代码速度。

Untested 未经测试

Sub testLoopPaste()

Dim i As Long
Dim ii As Long
Dim i3 as Long
Dim LastRow As Long
Dim wb As Workbook
Dim sht1 As Worksheet
Dim sht2 As Worksheet

Set wb = ThisWorkbook
Set sht1 = wb.Sheets("Sheet1")
Set sht2 = wb.Sheets("Sheet2")

'Find the last row (in column A) with data.
LastRow = sht1.Range("A:A").Find("*", searchdirection:=xlPrevious).Row
ii = 2

'This is the beginning of the loop
For i = 3 To LastRow
    'First activity
    sht2.Range("A" & ii) = sht1.Range("F" & i).Value
    sht2.Range("B" & ii) = sht1.Range("D" & i).Value
    sht2.Range("C" & ii) = sht1.Range("A" & i).Value
    sht2.Range("D" & ii) = sht1.Range("H" & i).Value
    ii = ii + 1

    'Second activity
    sht2.Range("A" & ii) = sht1.Range("F" & i).Value
    sht2.Range("B" & ii) = sht1.Range("D" & i).Value
    sht2.Range("C" & ii) = sht1.Range("A" & i).Value
    sht2.Range("D" & ii) = sht1.Range("I" & i).Value
    ii = ii + 1

    'Third activity
    For i3 = 1 To sht1.Range("K" & I)  
        sht2.Range("A" & ii) = sht1.Range("F" & i).Value  
        sht2.Range("B" & ii) = sht1.Range("D" & i).Value  
        sht2.Range("C" & ii) = sht1.Range("A" & i).Value  
        ii = ii + 1  
    Next i3

Next i

End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM