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

您所在的位置:网站首页 复制单元格到最后一行 循环中的Excel VBA复制和粘贴循环

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

2024-07-15 04:45| 来源: 网络整理| 查看: 265

我从事VBA代码已经有一段时间了,由于我是一个完整的菜鸟,所以我觉得自己什么都没得到。我一直在研究大量内容,但似乎无法结合答案来帮助解决我的情况。

本质上,我想做的是从一个工作表中逐行获取数据,并将其外推到另一个工作表。我相信这会涉及循环,而我对VBA还是很陌生,我不知道该怎么做。

这是我尝试的逻辑: 对于工作表1上的每一行,我想对工作表2执行3种不同的复制和粘贴活动,然后它将循环到sheet1的下一行并进行这3种活动,依此类推。这将继续向下,直到工作表1中的A列为空白。 Sheet1数据从A3开始,sheets2粘贴区域从A2开始。

第一个活动是将单元格F3,D3,A3和H3(按此顺序将F3复制为A2,D3将为B2等)从工作表1复制到工作表2,再复制到A2,B2,C2等。目标功能可以因为我只需要值而不需要其他格式,所以就不用了,这是我遇到的许多问题之一。

下一个活动是将单元格F3,D3,A3和I3从工作表1复制到粘贴在先前复制下面的工作表2,然后粘贴-同样,没有格式只是值。还要注意,其中一些可能为空(A列除外),但我仍然需要至少包含A列数据的那一行-包括所有这些活动。

第三个活动是将工作表1的F3,D3和A3复制并粘贴一定的次数(参考K3的编号),并且每次复制和粘贴都将在下一个可用的空白单元格中。因此,如果K3中的数字看起来像是在sheet2中创建了3行-由于activity1和2各自创建了自己的行,因此在sheet2上总共添加了5行。

在工作表1的第3行完成这三个活动之后,它将移至行4并执行前面的三个活动并粘贴到工作表2。再一次,它将不粘贴任何格式,并且将粘贴在工作表2的下一个空白行中。同样,一旦列A中的单元格为空白,此循环将停止。

下面是我不完整的代码。我什至不认为这会有所帮助,甚至最好不要看它。因为我什至无法进行简单的复制和粘贴,但是在循环中独自循环,我才开始感到沮丧。我什至还没有开始我的第三项活动。我非常感谢!

123456789101112131415161718192021222324252627282930313233Sub 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

相关讨论 你问的是可行的。 但是在我尝试尝试之前,先问一下这个问题。 似乎没有任何逻辑(即仅在x条件为true时粘贴)。 如果是这种情况,您是否可以仅粘贴整个列(以所需的顺序,而不是逐行粘贴?这将比循环快得多。 没错,没有任何逻辑可粘贴...除了我的第三个活动将查看列" k",然后弄清楚要复制并粘贴多少次,实际上是在工作表2中有多少行。我认为做列不会工作 ,因为目标表在每一列中都有许多重复名称。 重要的是要注意,活动2将像活动1一样粘贴在sheet2 A-D上,这就是为什么每个人都需要在sheet2中拥有自己的行的原因。 这会回答您的问题吗?

有很多方法可以做到这一点,有些方法效率更高。我的解决方案可能不是最有效的,但是希望它对您来说很容易理解,以便您可以学习。

很难理解您在练习三中要做什么,因此我无法为该步骤提供解决方案。将我的代码用作第三步的模板,如果遇到问题,请随时发表评论。

注意,在此代码中我没有使用.Activate,.Select或.Copy。 .Activate和.Select是高效的杀手kill,它们使您的代码更容易"破坏",因此请尽可能避免使用它们。在使用值或公式时,不需要.Copy,这也会降低代码速度。

未经测试

123456789101112131415161718192021222324252627282930313233343536373839404142434445Sub 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 相关讨论 是的,这绝对是我想做的!第三个活动将查看每个K列,并根据K列中的数字重复将F,D和A复制并粘贴到sheet2到A,B和C。我不确定如何做到这一点:- / 查看我更新的代码。我添加了活动三。第三个活动本质上是另一个循环,该循环根据K列中的数字循环。这是您要查找的内容吗? 就是这样!您不知道我尝试了多少时间!非常感谢! 嗨,ARich,我尝试向您发送消息,但是我想没有办法做到这一点。我不想再打扰您了,但是我很好奇您能否解释一下该代码的工作原理。我了解Dims和Set,但是我可以使用有关ii = 2的更多解释,以及为什么For i = 3和ii = ii + 1等。我只是不真正了解循环部分以及ii,我和i3专门工作... 别担心。注意如何将每个变量声明为As Long。在这种情况下,我将这三个变量用作计数器。例如,您希望循环从第三行开始,因此我将计数器i从3(For i = 3)开始。下一个计数器需要从第二行开始,即ii = 2,然后在需要进入下一行时,从ii = ii + 1开始。最后一个循环从1开始(对于i3 = 1),需要以K中的值结束。请阅读此内容以获取有关变量的更多信息。 嗨,ARich,现在我正在尝试使其更高级。而不是将其复制到工作表1的每个项目(到LastRow)到工作表2。有没有一种方法可以使用UserForm复制特定表单并将其粘贴到工作表2的最后一行?这有意义吗?我可以获取用户表格来填充每一行,但是不确定按钮单击代码应该是什么。 嗨@blasibr可能有一种方法可以满足您的需求。听起来您已经开始处理代码。如果您遇到困难,建议您研究/提出另一个问题,因为您可能会得到比我在评论中提供的答案更全面的答案。祝好运!

我通常在Excel中的工作表之间复制数据的方法是创建源范围对象和目标范围对象,每个范围仅引用一行。当我想移至下一行时,使用Offset将范围偏移量返回到下一行。

由于范围仅引用一行,因此您可以使用整数对它们进行索引以获取该行中的单元格。例如。如果cursor引用第3行中的A至D列,则cursor(3)将为您提供单元格C3。

12345678910111213141516Dim 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

同样,这可能会有些偏离主题,但是使用Enum命名列号而不是像我在此处那样对其进行硬编码是一种更好的做法。

相关讨论 感谢您的输入。看到比我自己更好的代码编写方式还是很高兴的!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3