提示用户打开工作簿和 Select 工作表,打开一个空白文件

Prompt User to Open a Workbook and to Select a Worksheet, opens an blank file

我希望用户选择工作簿,然后select他们需要的工作sheet。代码在 Debug - Step Into 时完美运行。但是,当通过按钮 运行 完成宏时,文件会打开并提示选择 sheet 但没有 sheet 或单元格可见。一切都是空白。文件没有保护。列名和行号不可见

 Sub LoadData()
     Dim ws As Worksheet
     Dim desiredSheetName As String
     Dim c As String

     Application.ScreenUpdating = False
     Application.DisplayAlerts = False

     ans = MsgBox("Choose the file to retrive the data?", vbYesNo, "Choose Source")
     If ans = vbYes Then
        myfile = Application.GetOpenFilename(, , "Browse for Workbook")
        If myfile <> False Then
           ThisWorkbook.Sheets("Destination").Range("AA2") = myfile
           Set src_data = Workbooks.Open(myfile)

          On Error Resume Next
          desiredSheetName = InputBox("Select any cell inside the target sheet: ",type:=8).worksheet.name 
          sht = desiredSheetName
          On Error GoTo 0

          Set dest = ThisWorkbook.Worksheets("Destination")

          src_data.Activate

          lastcell = src_data.Sheets(sht).Cells(Rows.Count, "C").End(xlUp).Row
          LastRowD = dest.Cells(dest.Rows.Count, "F").End(xlUp).Offset(0).Row

          src_data.Activate
          Sheets(sht).Select
          Range("A:B,D:D").Select
          Selection.Copy
          dest.Activate
          Range("F1").Select
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

          src_data.Close False

          dest.Select

        End If
   Else
     Exit Sub
 End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

myfile = False 您最终退出子程序时屏幕更新已关闭。您要么需要

  1. 确保您的代码从头到尾始终 运行 或
  2. 在提前退出之前重新打开应用程序。

If myfile <> False Then
    'Your code here
Else
    Application.ScreenUpdating = True  '<--- Re-enable before early exit
    Exit Sub
End If

如果您需要为 excel 的实例更正此问题,您目前只打开了 运行 一行以重新启用屏幕更新

Sub Oof ()

    Application.ScreenUpdating = True

End If

在请求范围选择之前,您不需要关闭屏幕更新,因为当宏为 运行 时,文件将打开,但屏幕不会更新以显示单元格。

给出您的代码的其他一些提示:

  • 您正在使用尚未声明的变量(shtsrcData)。
  • 如果您只使用一次变量(例如 MessageBox 中的 ans),只需将其直接插入,而不是调暗变量并使用它。例外情况是使用像数字这样的常量。在这种情况下,使用有意义的变量名总是比没有上下文的硬编码数字更好。
  • 你应该在你的模块的顶部设置 Option Explicit 然后你会 使用未声明的变量对此发出警告。
  • 您正在获取 destinationSheet 然后设置 sht 同样的事情。为什么不完全摆脱 sht
  • 与其混合变量命名约定(src_datadesiredSheetName),不如选择一个并坚持使用(我自己使用后一种格式)。
  • 选择和激活东西通常是错误的做法 除非您这样做是为了让用户可以看到特定的内容。 通常你应该只对范围和工作表进行操作 他们自己。此外,您应该明确说明您正在使用的工作表(因为否则它默认为 ActiveSheet)。例如:

而不是:

Range("A:B,D:D").Select
Selection.Copy
dest.Activate
Range("F1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

做:

src_data.Range("A:B,D:D").Copy
dest.Range("F1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

这使得您从何处复制以及粘贴到何处变得非常清楚,代码行数更少,处理速度也更快。

所以这是最终代码,具有明确命名和定义的变量,没有 Select 工作表,删除了未使用的变量。

Option Explicit
Sub LoadData()
     Dim sourcePath As String
     Dim sourceWorkbook As Workbook
     Dim sourceWorksheet As Worksheet
     Dim destinationWorksheet As Worksheet
     Dim lastSourceRow As Long
     Dim lastDestinationRow As Long

     'Application.ScreenUpdating = False '==>Moved after InputBox
     Application.DisplayAlerts = False
     Set destinationWorksheet = ThisWorkbook.Worksheets("Destination")

     If MsgBox("Choose the file to retrive the data?", vbYesNo, "Choose Source") = vbYes Then
        sourcePath = Application.GetOpenFilename(, , "Browse for Workbook")
        If sourcePath <> "False" Then
          destinationWorksheet.Range("A2") = sourcePath
          Set sourceWorkbook = Workbooks.Open(sourcePath)

          On Error Resume Next
          sourceWorksheet = Application.InputBox(prompt:="Select any cell inside the target sheet:", Type:=8).Worksheet
          On Error GoTo 0

          Application.ScreenUpdating = False

          lastSourceRow = sourceWorksheet.Cells(Rows.Count, "C").End(xlUp).Row
          lastDestinationRow = destinationWorksheet.Cells(destinationWorksheet.Rows.Count, "F").End(xlUp).Offset(0).Row

          sourceWorksheet.Range("A:B,D:D").Copy
          destinationWorksheet.Range("F1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

          sourceWorkbook.Close False

          destinationWorksheet.Select

        End If
   Else
     Exit Sub
 End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub