お力を貸してください。

エクセルマクロでデータを編集し、CSV出力する方法について質問です。一番初めに実行できるマクロを作成してくださった方には最低300~500ポイント、その他の方には150~300ポイント。

条件
・a1.xlsのシート1
   A列にID番号、B列に名前、C列にURL、D列にURLが書いてある
   ※
・b1.xlsのシート1
   A列にID番号、B列に住所が書いてある
   ※このとき、B列の住所は空欄の場合もある
・c1.xlsのシート1
   A列にID番号、B列に電話番号が書いてある
   ※A列のID番号は、a1.xlsのID番号、b1.xlsのID番号とは一致していない場合もある。

編集内容についてはコメントに記載します。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/01/24 13:36:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969

ポイント500pt

こんな感じでどうでしょうか。

また、a1.xlsとb1.xlsとc1.xlsを開いた状態で(ファイルの存在チェックとか簡略化するため)、

a1.xlsの標準モジュールにコードをコピーして実行してください。

同じ場所にa1.csvというファイル名で保存します。


Sub Macro()
    Dim lastRow As Long
    Dim i As Long
    Dim wb As Worksheet
    Dim wc As Worksheet
    Dim r As Range
    
    Set wb = Workbooks("b1.xls").Worksheets(1)
    Set wc = Workbooks("c1.xls").Worksheets(1)
    
    lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
    With Sheet2
        For i = 1 To lastRow
            .Range("A" & i).Value = Sheet1.Range("A" & i).Value
            If wb.Range("B" & i).Value <> "" Then
                .Range("B" & i).Value = "-1"
            Else
                .Range("B" & i).Value = "0"
            End If
            .Range("C" & i).Value = Sheet1.Range("B" & i).Value
            If Sheet1.Range("C" & i).Value <> "" Then
                .Range("D" & i).Value = Mid(Sheet1.Range("C" & i).Value, _
                    InStrRev(Sheet1.Range("C" & i).Value, "/") + 1)
                .Range("E" & i).Value = Mid(Sheet1.Range("D" & i).Value, _
                    InStrRev(Sheet1.Range("D" & i).Value, "/") + 1)
            Else
                If Sheet1.Range("D" & i).Value <> "" Then
                    .Range("D" & i).Value = Mid(Sheet1.Range("D" & i).Value, _
                        InStrRev(Sheet1.Range("D" & i).Value, "/") + 1)
                End If
            End If
            Set r = wc.Range("A:A").Find(Sheet1.Range("A" & i).Value)
            If Not r Is Nothing Then
                .Range("F" & i).Value = r.Offset(0, 1).Value
            End If
        Next i
    End With
    
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\a1.csv", _
        FileFormat:=xlCSV, CreateBackup:=False

End Sub
id:yuko0909

ありがとうございます!!!

思ってた通りに実行できました。

2009/01/24 13:36:23
  • id:yuko0909
    編集方法です。

    編集
    ・マクロの実行結果はa1.xlsのシート2に出力する。
     例)a1.xlsのシート1
       A列   B列     C列                  D列
       A0001  田中    http://www.xx.co.jp/yyy.xls    /kkk/fff.pdf
       A0002  佐藤    http://www.yy.co.jp/sss.pdf
       A0003  鈴木                       /www/kkk/eee.xls

       b1.xlsのシート1
       A列      B列
       A0001    ○○県○○市
       A0002     
       A0003    □□県□□市

       C1.xlsのシート1
       A列     B列
       A0001    012-345-6789
       A0003    123-456-7890

       実行結果)
         A列   B列    C列    D列      E列      F列
        A0001   -1    田中   yyy.xls   fff.pdf   012-345-6789
        A0002   0    佐藤   sss.pdf
        A0003   -1    鈴木   eee.xls          123-456-7890
        
    ・A列にはa1.xlsのA列の値を出力
    ・B列にはb1.xlsのB列に値がある場合は「-1」を、値がない場合は「0」を出力する
    ・C列にはa1.xlsのB列の値を出力
    ・D列、E列にはa1.xlsのC列、D列のURLの最後のスラッシュ以下の値を取得する。
     もし、a1.xlsのC列、D列の両方に値がある場合はa1.xlsのC列の値をD列に、a1.xlsのD列の値をE列に出力する。A1.xlsのC列に値がなく、D列にのみ値がある場合はa1.xlsのD列の値をC列に出力する。
    ・F列にはc1.xlsのA列の値がa1.xlsのA列の値と一致するものがある場合、c1.xlsのB列の値を出力する。
    ・出力したエクセルをCSV形式で保存する。
  • id:taknt
    >※A列のID番号は、a1.xlsのID番号、b1.xlsのID番号とは一致していない場合もある。

    これは、同じデータなんだけど ID番号が 別のものがある というように とらえられます。

    基本的には a1のID番号に一致する、b1、C1のID番号から データをもってくるというだけでいいかと思いますが。

    で、例外として
    a1にだけあるID番号
    b1にだけあるID番号
    C1にだけあるID番号
    の時、どうするのか?などが必要だと思いますね。

    ま、a1を基準して 作成すればいいのかと思いますが・・・。

    あと、ID番号の並びは ランダムの場合もありうりますよね?
    また、URLが あるけど ハイパーリンクは しなくてもいいよね?
    CSVに出力するだけだから いらないかとは 思うが、念のため・・・。

    と、いろいろ書くけど、私は そんなに時間が ないから 作れません、あしからず。
  • id:yuko0909
    >takntさん

    ご指摘ありがとうございます。
    >a1にだけあるID番号
    >b1にだけあるID番号
    >C1にだけあるID番号
    >の時、どうするのか?
    ⇒a1を基準に作成です

    >あと、ID番号の並びは ランダムの場合もありうりますよね?
    ⇒あります。

    >また、URLが あるけど ハイパーリンクは しなくてもいいよね?
    ⇒ハイパーリンクは必要ありません。
  • id:SALINGER
    あら、前回から考えてa1.xlsとb1.xlsのID番号の並びは一緒なのかと思ってたら違うこともあるのですか?
    その場合は少し修正が必要ですね。
  • id:SALINGER
    b1.xlsがランダムの場合の修正版をブログの方に載せておきました。

この質問への反応(ブックマークコメント)

トラックバック

  • SALINGERの日記 2009-01-24 13:43:42
    http://q.hatena.ne.jp/1232766401 のb1.xlsがランダムの場合の質問の修正です。 Sub Macro1() Dim lastRow As Long Dim i As Long Dim wb As Worksheet Dim wc As Worksheet Dim r1 As Range Dim r2 As Range Set wb = Workbooks(&quot;b1.xls&quot;).Wo
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません