提示用户打开工作簿和 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
您最终退出子程序时屏幕更新已关闭。您要么需要
- 确保您的代码从头到尾始终 运行 或
- 在提前退出之前重新打开应用程序。
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
在请求范围选择之前,您不需要关闭屏幕更新,因为当宏为 运行 时,文件将打开,但屏幕不会更新以显示单元格。
给出您的代码的其他一些提示:
- 您正在使用尚未声明的变量(
sht
、srcData
)。
- 如果您只使用一次变量(例如 MessageBox 中的
ans
),只需将其直接插入,而不是调暗变量并使用它。例外情况是使用像数字这样的常量。在这种情况下,使用有意义的变量名总是比没有上下文的硬编码数字更好。
- 你应该在你的模块的顶部设置
Option Explicit
然后你会
使用未声明的变量对此发出警告。
- 您正在获取
destinationSheet
然后设置
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
做:
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
我希望用户选择工作簿,然后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
您最终退出子程序时屏幕更新已关闭。您要么需要
- 确保您的代码从头到尾始终 运行 或
- 在提前退出之前重新打开应用程序。
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
在请求范围选择之前,您不需要关闭屏幕更新,因为当宏为 运行 时,文件将打开,但屏幕不会更新以显示单元格。
给出您的代码的其他一些提示:
- 您正在使用尚未声明的变量(
sht
、srcData
)。 - 如果您只使用一次变量(例如 MessageBox 中的
ans
),只需将其直接插入,而不是调暗变量并使用它。例外情况是使用像数字这样的常量。在这种情况下,使用有意义的变量名总是比没有上下文的硬编码数字更好。 - 你应该在你的模块的顶部设置
Option Explicit
然后你会 使用未声明的变量对此发出警告。 - 您正在获取
destinationSheet
然后设置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
做:
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