アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAについて以下の手順のマクロを教えてください。
1. CSVを読み取る
2.CSVのレコード(1行目)とExcelの1行目から横に並んでいる番号と一致したら Excelの2行目からCSVにある2行目(aa,bb等のデータ)のデータを入れたいです。
イメージは↓です、

csv
1行目 000,001,002,003
2行目 aa,bb,cc,dd

Excel
1行目 000 001 003 002
2行目 aa bb dd cc


csv1行目が000とExcelの1行目が000の場合、
Excelの2行目にaaを出力(csvのデータを出力)

CSVが3行目,4行目あれば Excelも3行目,4行目データが入ります。 (番号一致のみ出力)

まとめると
csvのキー名とExcelの1行目の値が一致したらそのデータを出力ということがしたいです。

質問者からの補足コメント

  • 1.test.csv
    2.sheet1
    3.認識の通りです。
    よろしくお願い致します。
    配列にして番号が紐ずつ情報を取ってくるという方法でもよいです。。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/06/01 21:47
  • ありがとうございます。
    確認したところ出力されましたが、以下の要望にまだ回答頂けておりません。。
    ”csvのキー名(それぞれの番号)とExcelの1行目(それぞれの番号)の番号が一致した場合、そのデータを取得する”
    分かりずらくすみません、よろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/06/01 23:08
  • 一度CSVファイルを読み込んで配列に格納しておいてから、Excelの1行目の番号を1行ずつ見ていって、配列の中身と照合して、CSV側にその番号があればそのデータを、なければ空欄をExcel側に書き込んでいく、という処理になるのかなと思います。。

      補足日時:2023/06/01 23:33
  • 一致しない場合もあります。それはcsv側です。
    000は文字通り000と文字列で入ります。
    まとまっているけど、形にできないのでお願いしております。

    問題は、一致するかしないかの判定、一致した場合の情報を取ってくるというところができないので聞いております。

      補足日時:2023/06/02 08:17
  • 分かりづらくすみません、
    イメージはこんな感じです、
    CSVファイルのヘッダ項目行(画像の2行目)の番号とExcelにあるヘッダ項目行(画像の9行目)の番号が一致したらその番号の情報をExcelに出力といった内容になります。
    Excelにあるヘッダ項目行のデータを1行ずつ見ていって、CSVファイルのヘッダ項目行の中身と照合して、値があればそれを、なければ空欄をExcel側に出力する流れです、

    「マクロを教えてください。」の補足画像5
    No.4の回答に寄せられた補足コメントです。 補足日時:2023/06/02 09:19
  • 上記の通りです。。

    No.5の回答に寄せられた補足コメントです。 補足日時:2023/06/02 09:21

A 回答 (7件)

下記URLにアップしました。


前回のは破棄してください。
https://ideone.com/L9xyRe
    • good
    • 0
この回答へのお礼

対応頂きありがとうございます。
確認したところほしい回答通りです。
本当にありがとうございました。

お礼日時:2023/06/02 10:04

>一致しない場合もあります。

それはcsv側です。

と言う事は、
・CSV側にはあってExcel側にはない?
・CSV側にはなくてExcel側にはある?

単純にExcelのデータをすべて消してCSVのデータを取り込むって事は不可能な感じの文章に思えますので(それなら付き合わせはしないでしょうし)、
上記の後者になるのかな?

>問題は、一致するかしないかの判定、一致した場合の情報を取ってくるというところができない

ちなみにですがExcelは単体インストールでしょうか、Access等も入っていますか?

ここからは独り言です:
CSVファイルを用いているのですから、1行目はExcel同様項目名が並んでいて以下にデータが存在するものだと思います。
最初の質問文でもそうなっているかな~と。
    • good
    • 0

No4です。


あなたのなさりたいことは、以下のようなことでしょうか。
1.CSVファイルの1行目の各列の値をキーと呼ぶ。
下記のCSVファイル1行目 A,B,C,Dがキーとなる。

2.Excelの1行目の各列の値をキーと呼ぶ。
下記のExcelのX,B,A,Cがキーとなる。
CSVファイルの2行目以降のデータを、Excelのキーの並び順にExcelに格納したい。
ExcelのキーはX,B,A,Cであるが、XはCSVファイルのキーに存在しないので、その列は常に空欄になる。


CSVファイル
1行目 A,B,C,D
2行目 a1,b1,c1,d1
3行目 a2,b2,c2,d2

Excel
1行目 X B A C
2行目 空欄 b1 a1 c1
3行目 空欄 b2 a2 c2
この回答への補足あり
    • good
    • 0

No2です。



>確認したところ出力されましたが、以下の要望にまだ回答頂けておりません。。
>”csvのキー名(それぞれの番号)とExcelの1行目(それぞれの番号)の番号が一致した場合、そのデータを取得する”

すみません。上記の意味が分かりません。具体的に例をあげて説明していただけませんでしょうか。
CSVのキー名とは、どの値のことですか。

私がNo2で投稿したマクロは、
CSVのキーとは、あなたの例では、000のことかと思っていました。(CSVファイルの1行、1列目の値)
これが、excelの1行、A列の値(000)と一致しているので、
CSVファイルの2行目~最後の行 をexcelにコピーしています。
この回答への補足あり
    • good
    • 0

前提として。



>Excelの1行目から横に並んでいる番号と一致したら

・まず一致しない場合があるのか?
・もし一致しない場合がある時、それはCSV側なのかExcel側なのか?
・CSVはともかくExcel側での【000】とは、セルの値は文字列になっているのか?またはセルの書式設定にて3桁表示にしているただの【0】なのか?

と言うよりも【補足日時:2023/06/01 23:33】にて考えがまとまっているようですから、あとは形にするだけだと思いますよ。
配列よりは連想配列【Dictionaryオブジェクト】を使うのが個人的には好きです。

あとは上級回答者にお任せします。
回答内容については見られませんので、内容がゴチャゴチャになって質問者さんも大変でしょうし。
    • good
    • 0

以下のマクロを標準モジュールに登録してください。


Const Folder As String = "D:\goo\data9"
はCSVファイルを格納してあるフォルダです。
あなたの環境にあわせて適切に設定してください。


Option Explicit

Public Sub CSV取り込み()
Const Folder As String = "D:\goo\data9"
Dim ws As Worksheet
Dim path As String
Dim sline As String
Dim head() As String
Dim elms() As String
Dim i As Long
Dim wrow As Long: wrow = 2
Set ws = Worksheets("Sheet1")
ws.Rows("2:" & Rows.count).ClearContents
path = Folder & "\" & "test.csv"
Open path For Input As #1
Line Input #1, sline
head = Split(sline, ",")
If head(0) <> ws.Cells(1, 1).Value Then
MsgBox ("キー不一致")
Exit Sub
End If
Do Until EOF(1)
Line Input #1, sline
elms = Split(sline, ",")
For i = 0 To UBound(elms)
ws.Cells(wrow, i + 1).Value = elms(i)
Next
wrow = wrow + 1
Loop
Close #1
MsgBox ("完了")
End Sub
この回答への補足あり
    • good
    • 0

補足要求です。


1.CSVファイルのファイル名は何でしょうか。
2.Excelのシート名は何でしょうか。
3.CSVファイルの1行、1列目の値とExcelの1行、A列の値が一致した場合、CSVファイルの2行目以降を、コピーするということで合ってますか。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!