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

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

ただいまの
回答率

89.13%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 940

ksk.foo2294

score 12

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

Sub ボタン1_Click()

'タブ区切りファイルを全て文字列として読み込む

    Dim FileName As String
    Dim i As Long
    Dim Cnt As Long
    Dim Buf As Variant
    Dim FileNo As Integer
    Dim SplitString As Variant
    Dim ArrayData As String
    Dim MaxRow As Variant
    Dim selectdata As Variant
    Dim selsheet As Variant

    'ファイルダイアログを表示
    FileName = Application.GetOpenFilename("CSVファイル,*.csv")


        '空いているファイル番号を取得
        FileNo = FreeFile()
        Buf = Space(FileLen(FileName))

        'ファイルを開いてbufに1行読み込み
        ' → タブで配列に分割
        ' → セルに書き出し
        Open FileName For Input As #FileNo
        Do Until EOF(FileNo)
            Line Input #FileNo, Buf
            Cnt = Cnt + 1
            SplitString = Split(Buf, ",")
            ArrayData = SpritString(3)
            'ここで配列化したCSVの一行をシート側のid同士が一致するとき、7割のデータを選別して入力
        MaxRow = Range("A9").End(xlDown).Row - 1
                    selsheet = Worksheets(Sheets.Count).Activate
                    On Error Resume Next
                    selectdata = Application.WorksheetFunction.Match(ArrayData, Range("A9:A" & MaxRow), 0)
                    On Error
           If Not (selectdata Is Nothing) Then
            For i = 5 To UBound(SplitString)
                Cells(selectdata.Row, (i + 1)) = SplitString(i)   'selectDataの行をとりたい
            Next i
        End If

        Loop

        Close #FileNo

前提・実現したいこと

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

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • torisan

    2019/01/30 13:25

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

    キャンセル

回答 1

+2

質問タイトルは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)が無かったり、ほしいデータと違うデータを配列から取り出して検索していませんか?

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る