【问题标题】:Multi step Copy and paste VBA script多步复制和粘贴 VBA 脚本
【发布时间】:2015-08-08 00:43:13
【问题描述】:

我正在尝试从四个测试结果(每个不同的 Excel 文件)中提取数据(单元格),以便可以在模板中计算平均值。然后循环并在接下来的四个测试中执行相同的操作,但让 VBA 脚本将 y 单元格向下放置。我正在尝试执行以下操作,

  1. 保护单元格,除了某些用于数据输入的单元格。- 完成
  2. 按下插入的按钮后,运行 VBA 脚本,该脚本将复制和粘贴其他四个 Excel 工作簿中的某些单元格。完成
  3. 复制和粘贴这四个之后,VBA 脚本循环但向下粘贴 y 个单元格。
  4. 最后强制保存,因为这是一个公共模板,不希望更改。

我在使用 3-4 时遇到问题,到目前为止,我有以下代码...,但我还没有做太多这方面的工作来了解顺序/正确的代码命令。

到目前为止我有什么

第 1 步:完成

Sub ProtectSheetDataInput ()

Worksheets("DataInput").Cells.Locked = False
Worksheets("DataInput").Range("A1:B283,C1:N3").Locked = True
Worksheets("DataInput").Protect Password:="----coop", UserInterfaceOnly:=True

End Sub

第 2 步:完成

'Separate Macro    

Sub DataTransfer()

Dim w As Workbook 'Test_Location 1
Dim x As Workbook 'Test_Location 2
Dim y As Workbook 'Test_Location 3
Dim z As Workbook 'Test_Location 4
Dim Alpha As Workbook 'Template

Set w = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_1.xls")
Set x = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_2.xls")
Set y = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_3.xls")
Set z = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_4.xls")
Set Alpha = Workbooks("FRF_Data_Sheet_Template.xlsm")

    Alpha.Sheets("DataInput").Range("C4:E8").Value = w.Sheets("Data").Range("I3:K7").Value
    Alpha.Sheets("DataInput").Range("F4:H8").Value = x.Sheets("Data").Range("I3:K7").Value
    Alpha.Sheets("DataInput").Range("I4:K8").Value = y.Sheets("Data").Range("I3:K7").Value
    Alpha.Sheets("DataInput").Range("L4:N8").Value = z.Sheets("Data").Range("I3:K7").Value

    w.Close False
    x.Close False
    y.Close False
    z.Close False

End Sub

第 3 步更新: 累了,如果在 C 列中找到空白,则粘贴...不起作用。

处出错
 If Columns("C").Value = "" Then 

“类型不匹配”

Sub DataTransfer()

Application.ScreenUpdating = False
Dim w As Workbook 'Test_Location 1
Dim x As Workbook 'Test_Location 2
Dim y As Workbook 'Test_Location 3
Dim z As Workbook 'Test_Location 4
Dim Alpha As Workbook 'Template
Dim Emptyrow As Long 'Next Empty Row

    Set w = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_1.xls")
    Set x = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_2.xls")
    Set y = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_3.xls")
    Set z = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_4.xls")
    Set Alpha = Workbooks("FRF_Data_Sheet_Template.xlsm")

        If Columns("C").Value = "" Then
            Alpha.Sheets("DataInput").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = w.Sheets("Data").Range("I3:K7").Value
            Alpha.Sheets("DataInput").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = x.Sheets("Data").Range("I3:K7").Value
            Alpha.Sheets("DataInput").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = y.Sheets("Data").Range("I3:K7").Value
            Alpha.Sheets("DataInput").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = z.Sheets("Data").Range("I3:K7").Value

            w.Close False
            x.Close False
            y.Close False
            z.Close False
        End If
Application.ScreenUpdating = True
End Sub

然后我尝试了一种不同的方法,我让它在 2 个工作表之间工作,但我无法让它在多个工作簿之间工作。我得到'运行时错误'9'下标超出这一行的范围。

Alpha.Sheets(DataInput).Activate

'

Sub DataTransfer()

Application.ScreenUpdating = False
Dim w As Workbook 'Test_Location 1
Dim x As Workbook 'Test_Location 2
Dim y As Workbook 'Test_Location 3
Dim z As Workbook 'Test_Location 4
Dim Alpha As Workbook 'Template
Dim Emptyrow As Range

    Set w = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_1.xls")
    Set x = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_2.xls")
    Set y = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_3.xls")
    Set z = Workbooks.Open("C:\Users\aholiday\Desktop\FRF_Data_Macro_Insert_Test\location_4.xls")
    Set Alpha = Workbooks("FRF_Data_Sheet_Template.xlsm")
    Set EmptyrowC = Range("C" & Sheets("DataInput").UsedRange.Rows.Count + 1)
    Set EmptyrowF = Range("F" & Sheets("DataInput").UsedRange.Rows.Count + 1)
    Set EmptyrowI = Range("I" & Sheets("DataInput").UsedRange.Rows.Count + 1)
    Set EmptyrowL = Range("L" & Sheets("DataInput").UsedRange.Rows.Count + 1)

        w.Sheets("Data").Range("I3:K7").Copy
        Alpha.Sheets(DataInput).Active
            NextRow.PasteSpecial Paste:=xlValues, Transpose:=False
            Application.CutCopyMode = False
            Set NextRow = Nothing
        x.Sheets("Data").Range("I3:K7").Copy
            Alpha.Sheets(DataInput).Active
            NextRow.PasteSpecial Paste:=xlValues, Transpose:=False
            Application.CutCopyMode = False
            Set NextRow = Nothing
        y.Sheets("Data").Range("I3:K7").Copy
            Alpha.Sheets(DataInput).Active
            NextRow.PasteSpecial Paste:=xlValues, Transpose:=False
            Application.CutCopyMode = False
            Set NextRow = Nothing
        z.Sheets("Data").Range("I3:K7").Copy
            Alpha.Sheets(DataInput).Active
            NextRow.PasteSpecial Paste:=xlValues, Transpose:=False
            Application.CutCopyMode = False
            Set NextRow = Nothing

        w.Close False
        x.Close False
        y.Close False
        z.Close False

Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 您可以改为复制到目的地。 y.Sheets("Sheet1").Range("A1:F5").Copy destination:=x.Sheets("InputSheet").Range("A1:F5")
  • 'it doesnt like the last line?你得到什么错误?
  • 运行时错误'91'对象变量或块变量未设置。
  • 无论如何,你必须告诉它X是什么。只是告诉编译器 X 是一个工作簿,只会让你到达那里的 1/2。将 X 设置为 ActiveWorkbook 的名称(或任何源工作簿的名称)应该让您更接近...

标签: vba excel


【解决方案1】:

这个不起作用,它会打开输出但不会复制单元格

我没有看到你打开 X 工作簿。

如果y.Sheets("Sheet1") 中的单元格已解锁,这对我来说很好用。

还要注意在两端使用.Value

Sub DataTransfer()
    Dim x As Workbook, y As Workbook

    Set y = Workbooks.Open("C:\Users\aholiday\Desktop\Test_output.xlsm")
    Set x = Workbooks.Open("C:\Blah Blah\Blah.xlsm") '<~~ Change as Applicable

    y.Sheets("Sheet1").Range("A1:F5").Value = x.Sheets("InputSheet").Range("A1:F5").Value
End Sub

【讨论】:

  • 让我尝试一些建议的事情,我会尽快回来。我没有打开 X 工作簿,因为它已经打开了。宏运行按钮位于 X 工作簿中。
  • 如果它已经打开那么你还需要初始化x 例如Set X = Workbooks("Blah.xlsm")
  • 错误 '9' 下标超出范围 Set x = Workbooks("C:\Users\aholiday\Desktop\Test_input.xlsm")
  • Set x = Workbooks("Test_input.xlsm")
  • 轰隆隆!第 1 步和第 2 步完成!太感谢了!关于我尝试做的其他事情有什么建议吗?第 3 步和第 4 步?
【解决方案2】:

改为复制到目的地。

y.Sheets("Sheet1").Range("A1:F5").Copy _           
   destination:=x.Sheets("InputSheet").Range("A1:F5") 

【讨论】:

  • Copy to destination instead.?为什么? OP的原始方法有什么问题?
  • 在不知道源和目标的情况下,这些值将不适用于合并的单元格,这将导致错误。您的另一个选择是找出问题的真正原因并加以解决。
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多