[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『別ブックへのmatchプロパティを使った行数取得について』(yoko)
エクセルの管理表に記載しているデータを別ブックのCSVに記載するツールを作成しようとして躓いております。
該当行にエクセル管理表から転記していく
当サイトや他サイトでも検索して原因を探してみましたが問題が解決できませんでしたのでご教授願います。
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 >
また、標準モジュールでシートの指定を省略した場合、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
返信ありがとうございます。
結論としては■3のCNoをvariant型にすることで解決しました。
エラー時も On Error GoToで回避するようにしたいと思います。
■1 ■2 についてもありがとうございます。
■1はご教授の通り動きとして無駄だと思いますので修正していきたいと思います。
■2も 変数の情報や値が不足しており、お手数をおかけいたしました。
どうもありがとうございました。
(yoko) 2020/06/24(水) 14:35
エラートラップで対応するなら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.