簡體   English   中英

如何使用If語句繞過一行代碼

[英]How to use the If statement to bypass a line of code

如果在過濾列時行為空,我如何繞過Selection.FormulaArray代碼,我不希望它添加公式,只需跳到代碼中的下一部分。 我認為這是一個if語句,但不知道如何編寫它。

ActiveSheet.ListObjects("Study_Setup").Range.AutoFilter Field:=31, Criteria1 _
:=RGB(255, 255, 204), Operator:=xlFilterCellColor
    
ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 30).Select

Selection.FormulaArray = _
    "=IFERROR(INDEX(RedaData!C[-29]:C[-9],MATCH(1,(RedaData!C[-26]=RC[-29])* 
(RedaData!C[-29]=RC[-26]),0),5),"""")"

當您使用listobject時,您應該利用這些好處:-)

例如,您可以使用列名而不是計算列。 要使用我的示例,您必須將“ColumnWithColor”替換為第 31 列的名稱,將“ColumnFormula”替換為第 30 列的名稱

Sub addFormula()

Dim lo As ListObject
Set lo = ActiveSheet.ListObjects("Study_Setup")

With lo
    .Range.AutoFilter field:=.ListColumns("ColumnWithColor").Index, Criteria1:=RGB(255, 255, 204), Operator:=xlFilterCellColor
End With

Dim rg As Range
On Error Resume Next ' in case there are no visible cells
    Set rg = lo.ListColumns("ColumnFormula").DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If Not rg Is Nothing Then
    rg.Formula = "=XXX"    'put your formula here
End If

lo.AutoFilter.ShowAllData

End Sub

如果您在一張具有不同過濾器的工作表上有多個列表對象,此解決方案也是安全的。

嘗試這個:

Dim rngS As Range

    ActiveSheet.ListObjects("Study_Setup").Range.AutoFilter Field:=31, Criteria1:=RGB(255, 255, 204), Operator:=xlFilterCellColor
    
    Set rngS = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
    If Not (rngS.Areas.Count = 1 And rngS.Rows.Count = 1) Then
        ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 30).FormulaArray = "=IFERROR(INDEX(RedaData!C[-29]:C[-9],MATCH(1,(RedaData!C[-26]=RC[-29])* (RedaData!C[-29]=RC[-26]),0),5),"""")"
    End If
    Set rngS = Nothing

這會檢查是否只有標題可見,如果不可見,請編寫您的公式。

再見。

你是對的。 正如該問題的另一個答案中已經指出的那樣,您可以使用If not [Range] Is Nothing限制公式的應用,我還建議顯式聲明對象和變量,因此如果對工作簿進行更改,代碼可以很容易在一個地方更新,有時關閉屏幕更新可以提高性能。 這是一個完全開發的示例:

Application.ScreenUpdating = False 'added to make the code run faster

'Explicitly defining everything saves time in the event of changes
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet
Dim lo As ListObject
Dim colorColumn As Integer
Dim formulaColumn As Integer
Set ws = wb.Sheets("RedaData")
Set lo = ws.ListObjects("Study_Setup")
colorColumn = 31
formulaColumn = 30

'Apply Filter
lo.Range.AutoFilter Field:=colorColumn, Criteria1 _
:=RGB(255, 255, 204), Operator:=xlFilterCellColor
Dim rg As Range
On Error Resume Next ' in case there are no visible cells
    Set rg = lo.ListColumns(formulaColumn).DataBodyRange.SpecialCells(xlCellTypeVisible)
    
'Apply formula to visible cells
If Not rg Is Nothing Then
    rg.Formula = "=IFERROR(INDEX(C[-29]:C[-9],MATCH(1,(C[-26]=RC[-29])*(C[-29]=RC[-26]),0),5),"""")"
End If

Application.ScreenUpdating = True 'Display results

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM