Excel 提示用户打开工作簿并选择工作表,将打开一个空白文件

Excel 提示用户打开工作簿并选择工作表,将打开一个空白文件,excel,vba,worksheet,Excel,Vba,Worksheet,我希望用户选择一个工作簿,然后选择他们需要的工作表。该代码在调试时工作正常。但是,当通过按钮运行完整宏时,文件确实会打开并提示选择工作表,但没有可见的工作表或单元格。都是空白的。该文件没有任何保护。列名和行号不可见 Sub LoadData() Dim ws As Worksheet Dim desiredSheetName As String Dim c As String Application.ScreenUpdating = False

我希望用户选择一个工作簿,然后选择他们需要的工作表。该代码在调试时工作正常。但是,当通过按钮运行完整宏时,文件确实会打开并提示选择工作表,但没有可见的工作表或单元格。都是空白的。该文件没有任何保护。列名和行号不可见

 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
子加载数据()
将ws设置为工作表
Dim desiredSheetName作为字符串
作为字符串的Dim c
Application.ScreenUpdating=False
Application.DisplayAlerts=False
ans=MsgBox(“选择要检索数据的文件?”,vbYesNo,“选择源”)
如果ans=vbYes,则
myfile=Application.GetOpenFilename(,“浏览工作簿”)
如果myfile为False,则
ThisWorkbook.Sheets(“Destination”).Range(“AA2”)=myfile
设置src_data=Workbooks.Open(myfile)
出错时继续下一步
desiredSheetName=InputBox(“选择目标工作表内的任何单元格:”,类型:=8)。工作表名称
sht=所需的图纸名称
错误转到0
Set dest=此工作簿。工作表(“目的地”)
src_data.Activate
lastcell=src_数据表(sht).单元格(Rows.Count,“C”).结束(xlUp).行
LastRowD=dest.单元格(dest.Rows.Count,“F”)。结束(xlUp)。偏移量(0)。行
src_data.Activate
图纸(sht)。选择
范围(“A:B,D:D”)。选择
选择,复制
目的地激活
范围(“F1”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank:=False,转置:=False
src_data.Close False
目的地选择
如果结束
其他的
出口接头
如果结束
Application.DisplayAlerts=True
Application.ScreenUpdating=True
端接头

myfile=False
关闭屏幕更新后退出子系统。你要么需要

  • 确保代码始终从头到尾运行,或者
  • 在提前退出之前重新打开应用程序

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

    为您的代码提供一些其他指针:

    • 您正在使用尚未声明的变量(
      sht
      srcData
    • 如果您只使用一次变量(如MessageBox中的
      ans
      ),只需直接插入该变量,而不是将变量变暗并使用该变量。例外情况是当使用像数字这样的常量时。在这种情况下,最好使用有意义的变量名,而不是没有上下文的硬编码数字
    • 您应该在模块顶部设置
      选项Explicit
      ,您将 使用未声明的变量对此发出警告
    • 您将获得
      目标表
      ,然后设置
      sht
      到相同的东西。为什么不干脆把
      sht
      一扫而光呢
    • 与其混合变量命名约定(
      src_data
      desiredSheetName
      ),只需选择一种并坚持使用它(我自己使用后一种格式)
    • 选择和激活事物通常是错误的做法 除非您这样做是为了让用户能够看到特定的内容。 通常,您应该只对范围和工作表执行操作 他们自己。此外,您应该明确说明正在使用的工作表(否则它默认为ActiveSheet)。例如:
    而不是:

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

    这就非常清楚地表明了从何处复制和粘贴到何处,代码行更少,处理速度也更快

    这是最后的代码,有明确的命名和定义的变量,没有
    Select
    ing表单,没有使用的变量被删除

    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
    
    选项显式
    子加载数据()
    将源路径设置为字符串
    将源工作簿设置为工作簿
    将源工作表设置为工作表
    Dim destinationWorksheet作为工作表
    将lastSourceRow设置为长
    将最后一个目的地排成一行
    'Application.ScreenUpdate=False'=>在InputBox之后移动
    Application.DisplayAlerts=False
    设置目标工作表=此工作簿。工作表(“目标”)
    如果MsgBox(“选择要检索数据的文件?”,vbYesNo,“选择源”)=vbYes,则
    sourcePath=Application.GetOpenFilename(,“浏览工作簿”)
    如果源路径为“False”,则
    destinationWorksheet.Range(“A2”)=源路径
    设置Source工作簿=工作簿。打开(sourcePath)
    出错时继续下一步
    sourceWorksheet=Application.InputBox(提示:=“选择目标工作表中的任意单元格:”,类型:=8)。工作表
    错误转到0
    Application.ScreenUpdating=False
    lastSourceRow=sourcesheet.Cells(Rows.Count,“C”).End(xlUp).Row
    lastDestinationRow=destinationWorksheet.Cells(destinationWorksheet.Rows.Count,“F”).End(xlUp).Offset(0).行
    sourceWorksheet.Range(“A:B,D:D”)。复制
    destinationWorksheet.Range(“F1”).Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblanks:=False,转置:=False
    sourceWorkbook.Close为False
    目的工作表。选择
    如果结束
    其他的
    出口接头
    如果结束
    Application.DisplayAlerts=True
    Application.ScreenUpdating=True
    端接头
    
    我感谢您对我的代码的帮助和见解。我尝试了你的代码,但我遇到了一些错误——1)当我使用hoover时,sourceWorksheet被分配为“Nothing”。2) lastSourceRow提供一个运行时eroor 91,它表示未设置对象变量或with block变量。
    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
    
    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