2

ヘッダーを含まない自動フィルタリングされた行をチェックするのに助けが必要です。「レコードが見つかりません」というメッセージボックスを表示したい。次に、subを終了するか、ヘッダー行を超える行がある場合はコピー貼り付けを続行します。データをチェックするためにフィルターの後にIf/Elseエントリが必要なことはわかっていますが、チェック方法がわかりません。このコードは、私が作成したユーザーフォームボタンから実行されています。

これが私のスクリプトです:

Private Sub Searchbycompanyfield_Click()

If CompanyComboBox1.Value = "" Then
    MsgBox "Please enter a Company to begin search."
    Exit Sub
End If
ActiveSheet.Range("$A:$H").AutoFilter Field:=1, Criteria1:=EQDataEntry.CompanyComboBox1.Value, Operator:=xlOr
Cells.Select
Selection.Copy
Sheets("Sheet2").Select
Range("A5").Select
ActiveSheet.Paste
Call MessageBoxYesOrNoMsgBox
End Sub

どんな助けでも大歓迎です。

4

5 に答える 5

3

行を数えるか、最後の行がヘッダーであるかどうかを確認します

if application.worksheetfunction.subtotal(3,activesheet.columns(1))>1 then 
    msgbox "Records"
else
    msgbox "No Records"
end if

最後の行を確認してください

if activesheet.cells(rows.count,1).end(xlup).row>1 then 
    msgbox "Records"
else
    msgbox "No Records"
end if
于 2012-10-01T22:12:52.327 に答える
3

以下を参照してください。SpecialCells(xlCellTypeVisible)を使用すると、フィルター処理されたセルのrngオブジェクトを返すことができます。あなたはあなたの状態のためにこれの行数をチェックする必要があるだけです:

Private Sub Searchbycompanyfield_Click()

    If CompanyComboBox1.Value = "" Then
        MsgBox "Please enter a Company to begin search."
    Exit Sub
    End If

    Dim sh As Worksheet
    Dim rng As Range

    Set sh = ActiveSheet

    sh.AutoFilterMode = False
    sh.Range("$A:$H").AutoFilter Field:=1, Criteria1:=EQDataEntry.CompanyComboBox1.Value, Operator:=xlOr

    Set rng = sh.UsedRange.SpecialCells(xlCellTypeVisible)

    If (rng.Rows.Count > 1) Then

        rng.Copy Sheets("Sheet2").[A5]

        Call MessageBoxYesOrNoMsgBox

    End If

End Sub
于 2012-10-02T12:08:47.750 に答える
0

これを必要とする他の人のために、私は最終的に以下を使用しました:

Private Sub Searchbycompanyfield_Click()

If CompanyComboBox1.Value = "" Then
    MsgBox "Please enter a Company to begin search."
Exit Sub
End If

Dim sh As Worksheet
Dim rng As Range

Set sh = ActiveSheet

sh.AutoFilterMode = False
sh.Range("$A:$H").AutoFilter Field:=1, Criteria1:=EQDataEntry.CompanyComboBox1.Value, Operator:=xlOr

Set rng = sh.UsedRange.SpecialCells(xlCellTypeVisible)

If (rng.Rows.Count > 1) Then

    rng.Copy Sheets("Sheet2").[A5]
    Sheets("Sheet2").Select
    Call MessageBoxYesOrNoMsgBox

Else
If ActiveSheet.AutoFilterMode Then ActiveSheet.Cells.AutoFilter
MsgBox "No records found."
Exit Sub
End If

End Sub

助けてくれてありがとう。

于 2012-10-02T16:46:36.030 に答える
0

これが、フィルター範囲を使用する方法をデモするためにリファクタリングされたmacoです。Selectまた、範囲の必要性を排除します

Sub Searchbycompanyfield()

    If CompanyComboBox1.Value = "" Then
        MsgBox "Please enter a Company to begin search."
        Exit Sub
    End If

    Dim sh As Worksheet
    Dim rng As Range

    Set sh = ActiveSheet
    ' clear any existing autofilter
    sh.AutoFilterMode = False
    sh.Range("$A:$H").AutoFilter Field:=1, _
        Criteria1:=EQDataEntry.CompanyComboBox1.Value, Operator:=xlOr

    Set rng = sh.AutoFilter.Range
    ' Check if there is any data in filter range
    If rng.Rows.Count > 1 Then
        Set rng = rng.Offset(1, 0).Resize(rng.Rows.Count - 1)
        On Error Resume Next
        Set rng = rng.SpecialCells(xlCellTypeVisible)
        If Err.Number = 1004 Then
            ' No cells returned by filter
            Exit Sub
        End If
        On Error GoTo 0
        rng.Copy ActiveWorkbook.Worksheets("Sheet2").[A5]

    End If
    ' remove filter
    sh.AutoFilterMode = False
    MessageBoxYesOrNoMsgBox

End Sub
于 2012-10-02T06:50:36.203 に答える
0

私はこれに対する解決策を見つけました。このソリューションを試してください。

Dim count As Long
count = Application.WorksheetFunction.count(rng_SmPrt.SpecialCells(xlCellTypeVisible))

これは、表示されている行の数を正しく返します。

于 2018-12-04T06:07:40.603 に答える