Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel-宏,复制到新工作簿不适用于8行中的多行_Excel_Csv_Macros_Vba - Fatal编程技术网

Excel-宏,复制到新工作簿不适用于8行中的多行

Excel-宏,复制到新工作簿不适用于8行中的多行,excel,csv,macros,vba,Excel,Csv,Macros,Vba,我试图使用宏代码将特定数量的行从.xlsm格式工作簿复制到.csv文件。如果我必须复制7行代码,那么代码可以正常工作。下面是将7行复制到.csv文件的屏幕截图。 当我试图以8的倍数复制行时,问题就出现了。将无限复制8行,直到工作表结束,如下所示: 这是我正在使用的代码。(7行或8行的代码保持不变) *在这里,只要值为1,k1就被初始化,LastRow变量的值为7(或8)。请注意,Col1是要复制的第一列 我是Excel宏新手,希望您能提供帮助。Excel会尝试用您复制的范围填充整个目标范围

我试图使用宏代码将特定数量的行从.xlsm格式工作簿复制到.csv文件。如果我必须复制7行代码,那么代码可以正常工作。下面是将7行复制到.csv文件的屏幕截图。

当我试图以8的倍数复制行时,问题就出现了。将无限复制8行,直到工作表结束,如下所示:

这是我正在使用的代码。(7行或8行的代码保持不变)

*在这里,只要值为1,k1就被初始化,
LastRow
变量的值为7(或8)。请注意,Col1是要复制的第一列


我是Excel宏新手,希望您能提供帮助。

Excel会尝试用您复制的范围填充整个目标范围

如果源中的行数不是目标行的一个因素,则它确定不可能均匀地执行此操作,只复制源一次

如果源中的行数是目标行数的一个因素,Excel只需反复重复源以填充整个目标区域

在您的情况下,7不是1048576的系数,因此只制作一份副本。8是1048576的系数,因此制作了131072份副本。源范围为1行、2行、4行、16行、32行等时将发生相同的“复制”

您的代码可以重写为:

For I = Col1 To Last_col - 1                
    ws.Range(ws.Cells(1, I), ws.Cells(LastRow, I)).Copy Destination:=wsNew.Range(wsNew.Cells(1, k1), wsNew.Cells(LastRow, k1))
    k1 = k1 + 1
Next I
或者您可以避免循环,只需使用:

ws.Range(ws.Cells(1, Col1), ws.Cells(LastRow, Last_col - 1)).Copy wsNew.Range("A1")

您可能需要提供更多的代码来查看索引/参数(例如,
LastRow
I
k1
)是如何演变的。@FDavidov我已经编辑了代码。您只是想将一个区域从一个工作表复制到另一个工作表吗?如果是这样,您可以只执行
ws.Range(ws.Cells(1,Col1),ws.Cells(LastRow,Last_col-1))。复制wsNew.Range(“A1”)
,而不需要循环。@YowE3K这是正确的,我最终使用类似的方法运行了代码。但我不明白为什么LastRow=8(或它的倍数)没有运行该代码。您正在复制到一整列中-对于任何数量的行,如果这些行均匀地划分为工作表中的总行数,则可能会执行相同的操作(即1048576或65536的所有因子,具体取决于Excel的版本)。
ws.Range(ws.Cells(1, Col1), ws.Cells(LastRow, Last_col - 1)).Copy wsNew.Range("A1")