質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

838閲覧

VBA CSV取得から条件のときに転記するプログラム

ksk.foo2294

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/01/30 03:28

VBAについて質問です。初心者です。
CSVからデータを読み込み、split関数を使い、配列変数SpritStringに入れました。。
シートにある範囲から配列変数にある文字列を検索したく配列変数split(0)="002"が入っていル状態で、これをmatch関数の因数に使いたいのですが、、
うまくいきません。
配列変数を引数にしても、コンパイルエラーsubまたはFunctionが定義されていません。になるか、WorkSheetFunctionクラスのMatchを取得できませんでしたとなり、対応できてないようです。
まず配列変数から値を取得してどうにかしてMatch関数の引数にいれることはできませんでしょうか。
ご対応お願いします。
ソースコードは編集中に付き、乱文で失礼いたします。
宜しくお願い致します。

vba

1Sub ボタン1_Click() 2 3'タブ区切りファイルを全て文字列として読み込む 4 5 Dim FileName As String 6 Dim i As Long 7 Dim Cnt As Long 8 Dim Buf As Variant 9 Dim FileNo As Integer 10 Dim SplitString As Variant 11 Dim ArrayData As String 12 Dim MaxRow As Variant 13 Dim selectdata As Variant 14 Dim selsheet As Variant 15 16 'ファイルダイアログを表示 17 FileName = Application.GetOpenFilename("CSVファイル,*.csv") 18 19 20 '空いているファイル番号を取得 21 FileNo = FreeFile() 22 Buf = Space(FileLen(FileName)) 23 24 'ファイルを開いてbufに1行読み込み 25 ' → タブで配列に分割 26 ' → セルに書き出し 27 Open FileName For Input As #FileNo 28 Do Until EOF(FileNo) 29 Line Input #FileNo, Buf 30 Cnt = Cnt + 1 31 SplitString = Split(Buf, ",") 32 ArrayData = SpritString(3) 33 'ここで配列化したCSVの一行をシート側のid同士が一致するとき、7割のデータを選別して入力 34 MaxRow = Range("A9").End(xlDown).Row - 1 35 selsheet = Worksheets(Sheets.Count).Activate 36 On Error Resume Next 37 selectdata = Application.WorksheetFunction.Match(ArrayData, Range("A9:A" & MaxRow), 0) 38 On Error 39 If Not (selectdata Is Nothing) Then 40 For i = 5 To UBound(SplitString) 41 Cells(selectdata.Row, (i + 1)) = SplitString(i) 'selectDataの行をとりたい 42 Next i 43 End If 44 45 Loop 46 47 Close #FileNo

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torisan

2019/01/30 04:25

SplitString なのか SpritString なのか。 Match の使い方は回答出てる通り合っているはずです。
guest

回答1

0

質問タイトルはCSVや配列について書かれていますが、質問の実態は

  • Matchでシート内のデータを検索して該当セルを探したいが、エラーが出る。
  • 検索対象を配列から持ってきているが、そのやり方がまずいのか、Matchの使い方がまずいのかが判らない。

ということでしょうか?だとすると、まずは最低限、やりたいこと「だけ」を切り出して、そもそもその書き方や使い方に間違いが無いか、問題が無いかを調べるのが基本です。問題の切り分けといいます。この場合「CSVや配列の扱い以前に、まず、Matchの使い方あってる?」というところを確認。そこに問題が無ければ、残るは配列やCSVの使い方なので、そちらを調べます。

まず、付記されたソースから肝心な部分だけを抜き出すとこんな感じかと思います。問題を簡単にするため、配列やらなにやらは取り払い、単純に「文字列"002」を「A9から最終行まで」から探すとういう記述にしました。

selsheet = Worksheets(Sheets.Count).Activate selectdata = Application.WorksheetFunction.Match("002", Range("A9:A1048575"), 0)

こうすると

  • その範囲に対象文字がある場合 …… selectdataに指定範囲のうち、該当する行番号が入る。
  • その範囲に対象文字が無い場合 …… エラー「1004: アプリケーション定義またはオブジェクト定義のエラーです」が出る。

ということが判ります。もしかしたらですが、この後者のエラーが出たりしていませんか?

まずはあなた自身が「Matchの使い方には問題無い」ことを確認しましょう。

で、次。質問文には「SpritString(0)に"002"」と書かれていますが、プログラム内でMatchに渡すデータは「SpritString(3)」を使っています。これは問題ありませんか?そもそも、SpritString(3)が無かったり、ほしいデータと違うデータを配列から取り出して検索していませんか?

こうやって順番に問題点のありそうなところをしらべ、問題が無いところを課題からそぎ落とし、本当の問題がどこにあるか絞って行ってみてください。

直接の回答ではありませんが、考え方、調べ方の参考になれば。

投稿2019/01/30 04:04

backyard

総合スコア534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問