为什么 Range 方法 Select 第一次有效但第二次无效

Why does the Range method Select work the first time but not the second

Sub History1()
'
' History Macro
'

'
Dim sDate As String
    Application.ScreenUpdating = False

    sDate = Sheets("Summary").Range("P1").Value
    If Not WorksheetExists(sDate) Then
        Sheets.Add.Name = sDate
    End If
    Sheets(sDate).Visible = True
    Sheets(sDate).Cells.UnMerge
    Sheets("Summary").Range("A1:Z100").Select
    Selection.Copy
    Sheets(sDate).Range("A1:Z100").Select
    Selection.Paste
    
    Sheets(sDate).Visible = False
    Sheets("Summary").Cells(3, 1).Select
    
    Application.ScreenUpdating = True
'    MsgBox ("Done")
End Sub

sDate 中的值是字符串 05_14_21 并且在子程序中较早使用时工作正常。 Range.Select 操作的第一个实例工作正常,至少我认为是这样。没有产生错误。第二个说“范围 class 的 Select 方法失败”。工作表“05_14_21”在第二次操作时可见。我很茫然。任何见解都将 appreciated.Th

您不能在未激活的 sheet 范围内使用 .Select。它会给你 运行-Time Error 1004。解决方法是首先 select sheet,然后 select 范围。但老实说,使用 .Select 是不必要的,并且会在宏为 运行 时使屏幕抖动。 .Select 也会减慢您的宏,当您开始在代码中使用循环时,这会变得非常明显。

相反,我建议直接引用您的范围,而不是像这样使用 .Select

Sub History1()

Dim sDate As String
    Application.ScreenUpdating = False

    sDate = Sheets("Summary").Range("P1").Value
    If Not WorksheetExists(sDate) Then
        Sheets.Add.Name = sDate
    End If
    Sheets(sDate).Visible = True
    Sheets(sDate).Cells.UnMerge
    Sheets("Summary").Range("A1:Z100").Copy Destination:= Sheets(sDate).Range("A1:Z100")
    
    Sheets(sDate).Visible = False
    
    Application.ScreenUpdating = True
'    MsgBox ("Done")
End Sub

我不确定您为什么需要 select 单元格 (3,1),但为了做到这一点,您需要激活正确的 sheet。正如在另一个答案中指出的那样,使用 select 是不可取的。这也导致更简洁的复制和粘贴方式。

    Dim sDate As String
    Application.ScreenUpdating = False

    sDate = Sheets("Summary").Range("A1").Value
    If WorksheetExists(sDate) = False Then
        Sheets.Add.Name = sDate
    End If
    Sheets(sDate).Visible = True
    Sheets(sDate).Cells.UnMerge
    
    Sheets("Summary").Range("A1:Z100").Copy _
    Destination:=Sheets(sDate).Range("A1:Z100")
    
    Sheets(sDate).Visible = False
    Sheets("summary").Activate
    Sheets("Summary").Cells(3, 1).Select
    
    Application.ScreenUpdating = True