Vba 基于集合参数复制列

Vba 基于集合参数复制列,vba,excel,Vba,Excel,我正在将信息从一个工作簿复制到另一个工作簿。到目前为止,如果每一列都有数据,我的代码就非常有效。当我试图将工作表(补充费用)的A列和B列中的信息重复复制到工作表(费用)中,并且B列为空时,该功能不起作用。下一次运行sub时,如果B列没有值,则会将其放置在下一个空白单元格中,而不是与A列相关的单元格中 以下是我目前掌握的代码: Sub SupplementaryExpenses() Dim x As Workbook Dim y As Workbook Set y = Workbooks

我正在将信息从一个工作簿复制到另一个工作簿。到目前为止,如果每一列都有数据,我的代码就非常有效。当我试图将工作表(补充费用)的A列和B列中的信息重复复制到工作表(费用)中,并且B列为空时,该功能不起作用。下一次运行sub时,如果B列没有值,则会将其放置在下一个空白单元格中,而不是与A列相关的单元格中

以下是我目前掌握的代码:

Sub SupplementaryExpenses()

 Dim x As Workbook
 Dim y As Workbook

 Set y = Workbooks.Open("File Path")
 Set x = Workbooks.Open("File Path")


x.Sheets("b.1 Supplementary expenses").Range("a9", Range("a9").End(xlDown)).Copy
y.Sheets("Expenses").Range("a1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues

x.Sheets("b.1 Supplementary expenses").Range("b9", Range("b9").End(xlDown)).Copy
y.Sheets("Expenses").Range("b1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues

x.Sheets("b.1 Supplementary expenses").Range("c9", Range("c9").End(xlDown)).Copy
y.Sheets("Expenses").Range("c1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues

此外,无论何时运行此sub,如果有办法用标志201601填充L列,然后在我输入下个月数据时更改为201602,这将非常有用。

获取最后使用的行,并更改您的范围声明,类似于以下内容:

    Dim LastRow
    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    x.Sheets("b.1 Supplementary expenses").Range(Cells(9, 1), Cells(LastRow, a)).Copy 'this is R1C1 format meaning row then column
您可以使用它来填充列 如果您将其放在代码的其余部分之后,并确保您的工作表中希望L列填充active:

     sDate = Format(Date, "yyyymm")    
     For i = 2 To LastRow' you may need to grab this anew if you added lines
      If Cells(i, "L") = vbNullString Then 'ensures that there isn't anything in the cell
        Cells(i, "L").value = sDate
      End If
     Next
试试这个:

Sub SupplementaryExpenses()

 Dim x As Workbook
 Dim y As Workbook
 Dim lastrow As Long
 Dim tRow as long


 Set y = Workbooks.Open("File Path")
 Set x = Workbooks.Open("File Path")
 With x.Sheets("b.1 Supplementary expenses")

     lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
     tRow = y.Sheets("Expenses").Range("a1").End(xlDown).Offset(1, 0).Row
     y.Sheets("Expenses").Range("A" & trow).Resize(lastrow - 8, 3).Value = .Range(.Cells(9, 1), .Cells(lastrow, 3)).Value
     y.Sheets("Expenses").Range("D" & trow).Resize(lastrow - 8, 1).Value = .Range(.Cells(9, 8), .Cells(lastrow, 8)).Value
 End With

End Sub
它将同时获取所有三列并将值分配给新区域。它不关心B列或C列中的空格


这应该比复制/粘贴更快,因为您只需要值。

限定所有
Range()
单元格()
列()
,等等的实例。您对范围的第一部分(
x.Sheets(“b.1补充费用”).Range(“a9”…
)进行了此操作,但没有限定下一个(
Range(“a9”)。结束(xlDown)
)。如果您添加对它的引用,它将对代码有很大帮助。在将来,指定它如何“不工作”会很有帮助,例如,什么都没有发生,或者发生了你意想不到的事情,等等。所以你想从原始文件中复制A、B、C和H列,并将它们粘贴到目标文件的A、B、C和D列?如果是这样,你将添加一行。添加的行与我在原始代码中遇到的问题相同。D列与A:C列偏移。@是的,我没有完全理解。我更改了一些内容,因此请查看整个代码。已解决。谢谢Scott,可能无法解决此问题。在代码中创建InputBox时遇到一些问题,以下是我迄今为止所做的:
Dim myValue As Variant Dim myValue1 As Variant myValue=InputBox(“句点?”)myValue1=InputBox(“SVC,RCV,Yale?”)对于i=2至lastrow-6行,如果单元格(i,“B”)=vbNullString,则单元格(i,“B”)。Value=“myValue1”结束,如果接下来对于i=2至lastrow-6行,如果单元格(i,“C”)=vbNullString,则单元格(i,“C”)。Value=“myValue”
而不是显示用户输入,则我的代码显示“myValue”或“myvalue1”有什么想法吗?我不确定你的问题是什么,但你确实有“i=2到最后一行-6行”这个词,而且“行”这个词没有帮助…我把它注释掉,并添加了一个“下一行”“将此代码与sub/end sub一起加载,并为我运行。您在哪里遇到问题?是什么问题?还有,我没有在您粘贴到那里的内容中看到创建lastrow的代码段,我假设它在您的代码中位于此部分之前?否则它不会对for/next循环产生任何影响。”。