【问题标题】:Opening an excel file & copying sheets using VBA使用 VBA 打开 Excel 文件和复制工作表
【发布时间】:2019-07-01 22:19:27
【问题描述】:

我需要将几个 excel 工作表(“Y”、“X”)从一个文件复制到另一个 excel 文件中的同一个工作表(称之为 Z - 我正在使用 VBA 的同一个文件)。 我的限制是第一个 excel 文件(带有 X,Y)的名称和路径正在改变,因此我试图使用“as String”和 Application.GetOpenFilename() 命令编写更通用的东西,但我'我收到一个错误。

试图分成2个不同的子

Sub BrowseForFile()
    Dim sFileName As String
    sFileName = Application.GetOpenFilename(, , "open the file: " )

    If sFileName = "false" Then Exit Sub
    MsgBox sFileName
    Workbooks.Open (sFileName)
    Workbooks(sFileName).Sheets("X").Activate
    Stop
  1. 运行时错误 9
  2. 文件未找到(我认为是 1004)

【问题讨论】:

  • 乍一看强制GetOpenFilename中的文件类型为“.xls*”,并且将sFileName设为Variant?
  • 错误在哪一行被抛出?
  • 所以您可以将sFileName 转换为字符串。 .GetOpenFilename() 返回类型 Variant,但是转换为字符串后您可以操作文件路径和文件名。

标签: excel vba


【解决方案1】:

如果用户按下 Cancel 按钮,则 GetOpenFilename 函数返回布尔值 False 而不是字符串 "false",因此您需要测试 If sFileName = False Then 并将其声明为 @987654326 @。

如果您打开工作簿,请始终将其引用到一个变量,以便您可以使用它轻松访问工作簿

Dim OpenedWb As Workbook
Set OpenedWb = Workbooks.Open(sFileName)

然后您可以使用变量Wb 来引用您打开的工作簿

OpenedWb.Worksheets("X").Activate

请注意,使用 .Select.Activate 是一种不好的做法,应该避免使用 (How to avoid using Select in Excel VBA)。而是使用另一个参考来引用您的工作簿。

Dim ws As Worksheet
Set ws = OpenedWb.Worksheets("X")

例如访问ws.Range("A1").Value 之类的范围。


Sub BrowseForFile()
    Dim sFileName As Variant 'needs to be variant because cancel returns a boolean False
    sFileName = Application.GetOpenFilename(, , "open the file: " )

    If sFileName = False Then Exit Sub

    MsgBox sFileName

    Dim OpenedWb As Workbook
    Set OpenedWb = Workbooks.Open(sFileName)

    Dim ws As Worksheet
    Set ws = OpenedWb.Worksheets("X")

    MsgBox ws.Range("A1").Value 'output the value of `A1` in worksheet `X` of workbook `sFileName`
End Sub

【讨论】:

  • 我认为 OP 使用.GetOpenFilename,因此用户可以指定文件的位置,而不是隐式定义它。
  • 实际上使用String 而不是Variant 会在GetOpenFilename() 返回的Variant 上执行隐式CStr(),但在检查"false" 时可能会导致意外行为,因为@ 987654342@ 是“假”而不是“假”;此外,不同的 Excel 语言可能会使用与 False 等效的本地语言。
  • @Peh,是的,对不起,我看到你已经扩展了你原来的答案:)
  • @Nacorid 是的,你是对的,但我不想在这里依赖隐式字符串转换。最好使用 Variant 并检查正确的类型,因此它返回一个 Variant/Boolean 用于取消和一个 Variant/String 如果选择了文件名。
  • @Pᴇʜ 谢谢。但是我需要将 X 表中的值(位于 VBA 未运行的文件中)复制到不同的 excel 文件(VBA 正在使用的文件中)。在尝试应用 ws.Range("A1:DU300").Select 我不能因为工作表并没有真正打开。应将 SFileName 中 Sheet X 中的值复制到 Temp1 表中。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多