如何在VBA中编写单元格的模块化副本子例程?

我需要能够写入一个复制子程序,它将读入input工作表名称和input单元格,并将这些数据复制到一个特定的输出表格并输出单元格。 这个子程序必须是模块化的,因为它将被用在多个工作表中。它只会将input表格中的数据复制到输出表格中。 这是我写的一个,但不起作用。

Public Sub Copy_Input_Data_To_Output_Data( _ ByVal pv_str_input_worksheet_name As String, _ ByVal pv_str_output_worksheet_name As String, _ ByVal pv_str_input_cell_range As String, _ ByVal pv_str_output_cell_range As String, _ ByRef pr_str_error_message As String) Worksheets(pv_str_input_worksheet_name).Range(pv_str_input_cell_range).Value = _ Worksheets(pv_str_output_worksheet_name).Range(pv_str_output_cell_range).Value End Sub 

这是应用于input表的那个子程序的代码。

 Call Copy_Input_Data_To_Output_Data( _ pv_str_in… _ pv_str_output_worksheet_name:="Sheet2", _ pv_str_input_cell_range:="B13:B17", _ pv_str_output_cell_range:=""B17,B20,B34,B18,B21", _ pr_str_error_message:=str_error_message) 

正如你所看到的,这段代码正在复制input单元格的范围,数据将被传送到另一个表单中的特定输出单元格。 请帮忙,我会大大的appericate! 🙂

试试这个代码。 它将粘贴到非连续范围的连续范围,反之亦然。 你甚至可以加强它,甚至足够聪明,以检测是否是两个相同大小的连续范围,所以它不会不必要的循环。

我也重写了代码以简化可读性。

 Option Explicit Sub RunIt() Dim mySheet As Worksheet, yourSheet As Sheet1 Dim myRange As Range, yourRange As Range Set mySheet = Sheets("mySheet") Set yourSheet = Sheets("yourSheet") Set myRange = mySheet.Range("A1:A3") Set yourRange = yourSheet.Range("A6,B7,C8") CopyCells mySheet, yourSheet, myRange, yourRange End Sub Sub CopyCells(wksIn As Worksheet, wksOut As Worksheet, rngIn As Range, rngOut As Range) If rngIn.Cells.Count <> rngOut.Cells.Count Then MsgBox "Ranges are not equal. Please try again." Exit Sub End If Dim cel As Range, i As Integer, arrOut() As String arrOut() = Split(rngOut.Address, ",") i = 0 For Each cel In wksIn.Range(rngIn.Address) wksOut.Range(arrOut(i)).Value = cel.Value i = i + 1 Next End Sub 

尝试Range对象的Copy方法。 如下所示,只要您的范围正确 – 将其复制到Range对象以提高可读性:

 Dim oRangeIn as Range Dim oRangeOut as Range Set oRangeIn = Worksheets(pv_str_input_worksheet_name).Range(pv_str_input_cell_range) Set oRangeOut = Worksheets(pv_str_output_worksheet_name).Range(pv_str_output_cell_range) oRangeIn.Copy oRangeOut Set oRangeIn = Nothing Set oRangeOut = Nothing 

如果你改变声明调用子将它的工作 – 但可能不是按预期:

 Call Copy_Input_Data_To_Output_Data( _ "Sheet1", _ "Sheet2", _ "B13:B17", _ "B17,B20,B34,B18,B21", _ "")