【问题标题】:Excel Macro: Setting a variable for a workbooks location?Excel 宏:为工作簿位置设置变量?
【发布时间】:2016-11-23 11:29:56
【问题描述】:

我需要编写一个宏脚本,该脚本将从一个 xml 工作簿复制数据并将值粘贴到另一个工作簿。我编写了下面的宏,它工作正常,但我需要每周为几个不同的文档运行它,所以这意味着我必须为每次运行替换文档名称。

这是我目前所拥有的:

Sub copying()

''''''Section 1''''''
Workbooks("Results_2561").Activate 'workbook i'm copying from
Range("B27:B41").Select
Selection.Copy
Workbooks("Overall_Results").Activate 'workbook i'm pasting to
Range("G2").PasteSpecial

''''''Section 2''''''
Workbooks("Results_2561").Activate
Range("C27:C41").Select
Selection.Copy
Workbooks("Overall_Results").Activate
Range("C2").PasteSpecial

''''''Section 3''''''
Workbooks("Results_2561").Activate
Range("I28:I40").Select
Selection.Copy
Workbooks("Overall_Results").Activate
Range("G17").PasteSpecial

''''''Section 4''''''
Workbooks("Results_2561").Activate
Range("J28:J40").Select
Selection.Copy
Workbooks("Overall_Results").Activate
Range("C17").PasteSpecial

End Sub

... 这只是剧本的一半。有没有办法我可以在开始时声明一个变量并将其设置为工作簿文件路径,这样我就可以调用它而不是一遍又一遍地键入和重新键入它? 最好不要使用类似的东西

Dim book1 as Workbook
Set book1 = Workbooks.Open("C://Results_2561.xlsm")

..因为这会在我运行脚本时不断打开和关闭文档。

谢谢

【问题讨论】:

  • 类似这样的:使用StringDim StrPath as StringStrPath = "C://Results_2561.xlsm"Set book1 = Workbooks.Open(StrPath )
  • 在宏的开头打开一个文件对话框怎么样?
  • 最好避免使用ActivateSelectionSelect。您可以在代码开头有一个 BIG With Workbooks("Results_2561"),然后复制 use .Range("B27:B41").Copy 到 PasteSpecial Workbooks("Overall_Results").Range("G2").PasteSpecial xlValues(如果您使用的是 PasteSpecial ,则需要另一个参数
  • 或者定义一个输入框变量,并在输入框中键入它将来自的文件的名称。然后在打开文件时使用该存储变量

标签: vba excel macros copy


【解决方案1】:

由于您只对复制值感兴趣,因此您可以使用此帮助程序 Sub

Sub CopyValues(rngToCopyFrom As Range, rngToCopyTo As Range)
    With rngToCopyFrom
        rngToCopyTo.Resize(.Rows.COUNT, .Columns.COUNT).Value = .Value
    End With
End Sub

在您的主代码中被利用,如下所示:

Sub main()
    Dim wsTo As Worksheet

    Set wsTo = Workbooks("Overall_Results").ActiveSheet '<--| set the worksheet to paste values to
    With Workbooks("Results_2561").ActiveSheet '<--| reference the worksheet to copy values from
        CopyValues .Range("B27:B41"), wsTo.Range("G2")
        CopyValues .Range("C27:C41"), wsTo.Range("C2")
        CopyValues .Range("I28:I40"), wsTo.Range("G17")
        CopyValues .Range("J28:J40"), wsTo.Range("C17")
    End With
End Sub

如果您的相关工作簿有多个工作表,则只需替换

ActiveSheet

Worksheets("myRelevantShetName") '<--|change "myRelevantShetName" to the actual name of the relevant worksheet in each workbook

【讨论】:

  • 不客气。另请参阅已编辑的代码,以进一步减少键入工作,并为具有显式工作表限定的范围引用提供更强大的方法。如果我的回答解决了您的问题,您可能希望将其标记为已接受。谢谢
【解决方案2】:

首先,当您想要复制/粘贴某些内容时,您不必每次都激活工作簿。只需在Range() 属性中声明即可,例如:

''''''Section 1''''''
Workbooks("Results_2561").Sheets(1).Range("B27:B41").Copy
Workbooks("Overall_Results").Sheets(1).Range("G2").PasteSpecial

您可以将工作簿设置为变量,如:

Sub copying()
Dim wb1 As Workbook, wb2 As Workbook
Set wb1 = Workbooks("Results_2561")
Set wb2 = Workbooks("Overall_Results")

''''''Section 1''''''
wb1.Sheets(1).Range("B27:B41").Copy
wb2.Sheets(1).Range("G2").PasteSpecial
End Sub

最后,正如@A.S.H 建议的那样,您可以添加一个文件对话框,在其中指出要使用的文件。我已经把它放在了一些函数中(别忘了把它和你的copying宏放在同一个项目中):

Function strPath() As String
Dim intResult As Integer
Application.FileDialog(msoFileDialogFilePicker).Title = "Select file"
intResult = Application.FileDialog(msoFileDialogFilePicker).Show
If intResult <> 0 Then
    strPath = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
End If
End Function

所以第 1 节的最终代码如下所示:

Sub copying()
Dim wb1 As Workbook, wb2 As Workbook
MsgBox "Show file to copy form."
Set wb1 = Workbooks.Open(strPath())
MsgBox "Show file to paste in."
Set wb2 = Workbooks.Open(strPath())

''''''Section 1''''''
wb1.Sheets(1).Range("B27:B41").Copy
wb2.Sheets(1).Range("G2").PasteSpecial
End Sub

【讨论】:

  • 太棒了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多