【问题标题】:Referening VBA GetOpenFilename (Excel Macro)引用 VBA GetOpenFilename(Excel 宏)
【发布时间】:2021-08-02 23:53:16
【问题描述】:

我正在运行存储在活动工作簿中的 Excel 宏。我希望它提示打开一个文件,引用为 OldWorkbook 并从 OldWorkbook 复制值,然后将它们的值粘贴到活动工作簿中。

在“将范围复制到剪贴板便笺”之后出现错误。好像它现在不承认“OldWorkbook”的任何价值?

Sub Version_Convert()

Dim OldWorkbook As Variant

OldWorkbook = Application.GetOpenFilename("Excel Files (*.xl*),*.xl*", , "Choose File", "Open", False)
If OldWorkbook = "False" Then

Else
Workbooks.Open (OldWorkbook)
End If

'Copy range to clipboard
Workbooks(OldWorkbook).Worksheets("PKG").Range("B12:CW28").Copy

'PasteSpecial to paste values, formulas, formats, etc.
ThisWorkbook.Worksheets("PKG").Range("B12:CW28").PasteSpecial Paste:=xlPasteValues
  
End Sub

为什么使用字符串会给我一个错误?如何使 OldWorkbook 可用?

【问题讨论】:

  • Dim wb As Workbook, Set wb = Workbooks.Open(OldWorkbook),然后将Workbooks(OldWorkbook) 更改为wb
  • OldWorkbook 是文件的完整路径,但 Workbooks() 只需要文件名。

标签: excel vba getopenfilename


【解决方案1】:

引用和复制

  • Application.GetOpenFilename 将返回文件的(完整)路径 (String) 或 False (Boolean)。这就是为什么您必须首先将OldWorkbook 声明为Variant。因此使用引号 ("False") 是不正确的。
  • 假设Application.GetOpenFilename 的结果(文件路径)是C:\Test\Test.xlsx
    在您的代码中,您实际上是在尝试执行
    Workbooks("C:\Test\Test.xlsx").Worksheets("PKG").Range("B12:CW28").Copy错误) 而不是
    Workbooks("Test.xlsx").Worksheets("PKG").Range("B12:CW28").Copy正确),因为Workbooks(...) 需要文件名称,而Workbooks.Open(...) 需要文件路径 .
  • 解决此问题的最佳方法是实现工作簿变量,正如 BigBen 在 cmets 中建议的那样,即在打开工作簿时创建对工作簿的引用。然后您不必关心文件名和文件路径,您只需在代码的延续中使用变量即可。
  • 复制值时,通过赋值复制比使用PasteSpecial 更有效(参见解决方案 2 和 3)。
Option Explicit


Sub VersionConvertQuickFix()

    Dim wb As Workbook
    Dim OldWorkbook As Variant
    
    OldWorkbook = Application.GetOpenFilename("Excel Files (*.xl*),*.xl*", , "Choose File", "Open", False)
    If OldWorkbook = False Then
        Exit Sub ' To prevent an error from occurring when canceling the dialog.
    Else
        Set wb = Workbooks.Open(OldWorkbook)
    End If
    
    'Copy range to clipboard
    wb.Worksheets("PKG").Range("B12:CW28").Copy
    
    'PasteSpecial to paste values, formulas, formats, etc.
    ThisWorkbook.Worksheets("PKG").Range("B12:CW28").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
  
End Sub


Sub VersionConvert()
    
    ' Create a reference to the Source Range.
    Dim swbPath As Variant
    swbPath = Application.GetOpenFilename( _
        "Excel Files (*.xl*),*.xl*", , "Choose File", "Open", False)
    If swbPath = False Then
        'MsgBox "Canceled."
        Exit Sub
    End If
    Dim swb As Workbook: Set swb = Workbooks.Open(swbPath)
    Dim srg  As Range: Set srg = swb.Worksheets("PKG").Range("B12:CW28")
    
    ' Create a reference to the Destination Range.
    Dim drg As Range: Set drg = ThisWorkbook.Worksheets("PKG").Range("B12:CW28")
        
    ' Copy by assignment (values only).
    drg.Value = srg.Value
    
    'swb.Close SaveChanges:=False
    'drg.Worksheet.Parent.Save ' or ThisWorkbook.Save

End Sub


Sub VersionConvertDifferentDestinationAddress()
    
    ' Create a reference to the Source Range.
    Dim swbPath As Variant
    swbPath = Application.GetOpenFilename( _
        "Excel Files (*.xl*),*.xl*", , "Choose File", "Open", False)
    If swbPath = False Then
        'MsgBox "Canceled."
        Exit Sub
    End If
    Dim swb As Workbook: Set swb = Workbooks.Open(swbPath)
    Dim sws As Worksheet: Set sws = swb.Worksheets("PKG")
    Dim srg As Range: Set srg = sws.Range("B12:CW28")
    
    ' Create a reference to the Destination Range.
    Dim dwb As Workbook: Set dwb = ThisWorkbook
    Dim dws As Worksheet: Set dws = dwb.Worksheets("PKG")
    Dim dfCell As Range: Set dfCell = dws.Range("A1") ' e.g.
    Dim drg As Range: Set drg = dfCell.Resize(srg.Rows.Count, srg.Columns.Count)
    
    ' Copy by assignment (values only).
    drg.Value = srg.Value

    'swb.Close SaveChanges:=False
    'dwb.Save
    
End Sub

【讨论】:

  • 非常感谢您提供的精彩而详细的答案。运行快速修复选项时仍然出现错误,我得到:运行时错误'9':下标超出范围这发生在 wb.Worksheets("PKG").... 行
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多