2016-03-15 71 views
3

我试图简化从以下VBA如何通过整数范围值

Public Sub freezeRow(sheetAct, sheetType As String, sheetRow As Integer) 

sheetAct.Activate 'Activate sheet 
ActiveWindow.FreezePanes = False 'Unfreeze all rows 

Select Case sheetType 
    Case "Sum" 
     'Freeze the Summary spread sheet after row 9 
     sheetAct.Range("10:10").Select 

    Case "Data" 
     'Freeze the Summary spread sheet after row 2 
     sheetAct.Range("3:3").Select 
End Select 

ActiveWindow.FreezePanes = True 'Freeze selected rows 

End Sub 

此功能,这样的事情

Public Sub freezeRow(sheetAct, sheetType As String, sheetRow As Integer) 

sheetAct.Activate 'Activate sheet 
ActiveWindow.FreezePanes = False 'Unfreeze all rows 

sheetAct.Range("sheetRow:sheetRow").Select 


ActiveWindow.FreezePanes = True 'Freeze selected rows 

End Sub 

我似乎无法删除报价在range,当我运行它抛出一些模糊的错误

+1

' “sheetRow:sheetRow”'应该是'sheetRow& “:” &sheetRow“' –

+1

也许'sheetAct.Cells(sheetRow, 1).EntireRow.Select'。另外 - 'sheetRow As Integer' - 整数将在28000行之后出错或其他...使用'sheetRow as Long' –

+0

'sheetAct.Rows(sheetRow).Select' –

回答

1

我喜欢使用Cells()所有的时间,因为它更多明确的(我反正)

sheetAct.Range("sheetRow:sheetRow").Select

With sheetAct 
    .Range(.Cells(sheetRow,1),.Cells(sheetrow,1)).EntireRow.Select 
End with 

或者,只是使用sheetAct.Range(sheetRow & ":" & sheetRow).Select

但为什么使用.Select?您可以work around using .Select这是最佳做法。 (当然,如果你使用它来仔细检查你是否有正确的范围,那就没问题,这是你处理数据时要小心的地方)。

+0

.Cells给出了一个非限定的引用错误sheetAct.Range(.Cells(sheetRow,1),.Cells(sheetRow,1))。EntireRow.Select –

+0

@RickFlyFish - 如何将'sheetAct'发送给sub?我假定它是一个'Worksheet'。另外请注意,'.Range'不是以'sheetAct.'开始,使用'With',只需使用'.'作为一个“地方举行ER”。 – BruceWayne

0

我发现,这种方法工作完全

Public Sub freezeRow(sheetAct, sheetRow As String) 
    Dim rangeVal As String 

    rangeVal = sheetRow & ":" & sheetRow 
    sheetAct.Activate 'Activate sheet 
    ActiveWindow.FreezePanes = False 'Unfreeze all rows 
    sheetAct.Range(rangeVal).Select 'Select appropriate row 

    ActiveWindow.FreezePanes = True 'Freeze selected rows 

末次

这仅适用于冷冻头是可见的,而通过数据

1

作为一个快速的解决方案滚动,我认为是这样的:

Public Sub freezeRow(sheetAct As Worksheet, sheetRow As String) 
    Application.Goto sheetAct.Rows(sheetRow) 
    ActiveWindow.FreezePanes = False 
    ActiveWindow.FreezePanes = True 
End Sub 

您可以添加行ActiveWindow.Split = False之间ActiveWindow.FreezePanes = FalseActiveWindow.FreezePanes = True,因为如果FreezePanes完成后Split,然后ActiveWindow.FreezePanes = False将更改窗口回到Split-状态像以前一样。在这种情况下,ActiveWindow.FreezePanes = True将忽略所选范围并在Split所在的位置将其冻结。

另外我建议使用sheetAct.Rows(sheetRow + 1),因为窗格将被冻结在sheetRow以上。但是,这不仅仅是因为3更好的逻辑->将冻结3行,而不是如果2