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