0

私のマクロには、次のコードがあります。

i = Application.WorksheetFunction.Match(str_accrual, Range(Selection, Selection.End(xlToRight)), 0)

ここで、「str_accrual」はこの行の前にキャプチャされた文字列であり、選択された範囲は「A1」から「BH1」までの単一の行にあり、結果は選択された範囲内のその文字列の位置である数値になります。

マクロを実行すると、次のエラーが表示されます。

実行時エラー '1004' WorksheetFunction クラスの Match プロパティを取得できません

しかし、(F8) キーを使用して行ごとにマクロを実行すると、このエラーは発生しませんが、マクロを連続して実行するとエラーが発生します。繰り返しますが、マクロを中止して再度実行すると、エラーは表示されません。

4

8 に答える 8

1

このエラーに関する投稿はたくさんありますが、投稿を読む限り解決策はありません。 さまざまなワークシート機能が機能するには、ワークシートがアクティブ/可視である必要があるようです。(これは少なくとも、Match() が誤った理由でランダムに機能していた後の私の最新の発見です。)

この種のルックアップ アクションのためにワークシートをアクティブ化するのは苦痛であり、数 CPU サイクルのコストがかかりますが、謎が解かれることを願っています。

そのため、構文のバリエーションをいじったところ、表示されているワークシートに関係なく、アンダースコアの改行を削除した後にコードが機能し始めたことがわかりました。<-まあ、何らかの理由でワークシートをアクティブにする必要がありました:-(

'動作しません

'Set oCllHeader = ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, _
                    Application.Match( _
                        strValue, _
                        ActiveWorkbook.Worksheets("Auswertung").Range( _
                            oCllSpielID, _
                            ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, lastUsedCellInRow(oCllSpielID).Column)), _
                            0))

' は機能します (読みやすくするためにアンダースコアで改行を削除しました) <- この構文は後で機能しなくなり、ワークシートをアクティブにする方法はありません :-(

Set oCllHeader = ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, Application.Match(strValue, ActiveWorkbook.Worksheets("Auswertung").Range(oCllSpielID, ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, lastUsedCellInRow(oCllSpielID).Column)), 0))

結局のところ、私はこの謎にさらに気づき、また多くの時間を費やすことを心配しています。

乾杯

于 2016-07-14T20:34:12.313 に答える
1

何度か試しました。一致がない場合、式によってこのエラーが発生するようです

エラーをキャッチしたい場合は、Application.Match代わりに使用してください

次に、それをラップすることができますisError

于 2013-09-26T14:41:44.250 に答える
0

代わりにこれを試してください:

If Not IsError(Application.Match(str_accrual, Range(Selection, Selection.End(xlToRight)), 0)) Then
    i = Application.Match(str_accrual, Range(Selection, Selection.End(xlToRight)), 0)
Else
    'do something if no match is found

End If

アップデート

Selectionこれは、検索範囲を定義するためのユーザー入力の手段として以外に依存しない、より優れたコードです。

Sub Test()

Dim str_accrual As String
Dim rngToSearch As Range

str_accrual = InputBox("Search for?")

Set rngToSearch = Range(Selection, Selection.End(xlToRight))

If Not IsError(Application.Match(str_accrual, rngToSearch, 0)) Then
    i = Application.Match(str_accrual, rngToSearch, 0)
    MsgBox i
Else
    MsgBox "no match is found in range(" & rngToSearch.Address & ")."
End If
End Sub
于 2013-09-26T14:49:40.573 に答える