[[20200624105530]] 『別ブックへのmatchプロパティを使った行数取得にax(yoko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『別ブックへのmatchプロパティを使った行数取得について』(yoko)

エクセルの管理表に記載しているデータを別ブックのCSVに記載するツールを作成しようとして躓いております。


やりたいこと
GetopenFilenameでCSVを開く
突合キーをエクセル管理表から取得
CSVのF列に記載済の突合キーと照合し行番号を取得  ←ここで実行時エラー1004

該当行にエクセル管理表から転記していく


当サイトや他サイトでも検索して原因を探してみましたが問題が解決できませんでしたのでご教授願います。

Dim FName As Variant
Dim key As String
Dim OpenWB1 As Workbook

FName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")
Workbooks.Open FName
Set OpenWB1 = ActiveWorkbook

ThisWorkbook.Activate
key = Cells(x, 1)

OpenWB1.Activate

 CNo = WorksheetFunction.Match(key, Range("$F$1:$F$20000"), 0) 'セル行番号取得

ここで
実行時エラー 1004
worksheetFunction クラスのmatchプロパティを取得できません。
と表示されてしまいます。

この後は以下のようになります。

    Cells(CNo, "AQ") = irai
    ・
  ・
  ・

大変申し訳ありませんが、どなたかご教授よろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


今までは今回とは逆のパターンで
別のエクセルを開いて、その中のデータをキーとして、
自ブック側の一致する行を取得し
必要情報を書き込むという際には
記載のような文で動作していたのですが
matchの書き方が異なるのでしょうか
(yoko) 2020/06/24(水) 11:33

■1
VBAの世界では基本的に、ブックやシート(オブジェクトと言います)を明示すれば、いちいちアクティブにしたり選択したりする必要はありません。

また、標準モジュールでシートの指定を省略した場合、ActiveSheetを指定したものとして扱われる決まりです。

さらに、〜.Cells(x, 1)のようにプロパティを省略した場合は、Valueプロパティを指定していると見なされるルールです。
(Rangeオブジェクトとして参照している場合は違いますが・・・)

■2
部分だけ提示されてるのでよくわかりませんが、「■1」を踏まえてそれぞれ1番目のシートだと仮定して整理してみるとこんな感じになります

    Sub ななしのまくろ()
        Dim FName As Variant
        Dim key As String
        Dim OpenWB1 As Workbook

        FName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")
        Set OpenWB1 = Workbooks.Open(FName)

        With ThisWorkbook.Worksheets(1)
            key = .Cells(x, 1).Value
            CNo = WorksheetFunction.Match(key, .Range("F1:F20000"), 0) 'セル行番号取得

            .Cells(CNo, "AQ") = irai
        End With

    End Sub

そうなると「x」「CNo」「irai」は(提示されている限りでは)宣言していないので,まずはそちらを直した方がよいでしょう。
その上で「x」に注目してください。「x」には整数が入るはずです。そして整数型の初期値は「0」です。
ということは、xを宣言しても代入していなければ↓のようになり、【0】行目なんてありませんから、まずそこがおかしいです、

 key = ThisWorkbook.Worksheets(1).Cells(0, 1).Value

■3
次に、「WorksheetFunction.Match」で実行時エラーが出るというところですが、ワークシート上でMatch関数を使って見るとわかりますが、見つからない場合はエラーになりますよね。
実は、ExcelVBAでは「WorksheetFunction.Match」で見つからなかった場合は、実行時エラーが発生する仕様になっています。
これを回避する方法はいくつかありますが、
「WorksheetFunction.Match」 →「Application.Match」に変更してみてください。
このようにすると、【実行時エラーが発生】→【エラー値を取得】に変わります。

このとき問題になるのが、"エラー値"が返ってくる点です。
"エラー値"は数値ではないので、「CNo」を数値型で宣言すると"エラー値"が返ってきた場合、型が合わないというエラーが発生するようになってしまいます。

したがって、「CNo」は↓のように何でも型である Variant型で宣言してあげる必要があります。

 Dim CNo as Variant

ちょっと時間がないので、とりあえず上記に注意してご自身のコードを修正してみてください。
(その間に、他の回答者さんからアドバイスがあるかもしれませんが・・・・)

(もこな2) 2020/06/24(水) 13:14


もこな2様

返信ありがとうございます。

結論としては■3のCNoをvariant型にすることで解決しました。
エラー時も On Error GoToで回避するようにしたいと思います。

■1 ■2 についてもありがとうございます。
■1はご教授の通り動きとして無駄だと思いますので修正していきたいと思います。

■2も 変数の情報や値が不足しており、お手数をおかけいたしました。

どうもありがとうございました。

(yoko) 2020/06/24(水) 14:35


■4
>結論としては■3のCNoをvariant型にすることで解決しました。
>エラー時も On Error GoToで回避するようにしたいと思います。

エラートラップで対応するならVariant型でなくてもよいです。

    Sub 実験()
        Dim 変数 As Long

        On Error Resume Next
        変数 = WorksheetFunction.Match("存在しない", Range("A1:A10"), 0)
        On Error GoTo 0

        If 変数 > 0 Then
            MsgBox 変数 & "行目で発見"
        Else
            MsgBox "見つかりませんでした"
        End If

    End Sub

(もこな2) 2020/06/24(水) 16:52


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.