• 締切済み

ExcelVBA 名簿の別ブック(CSV)へコピーについて

VBAは学生時代勉強したもののすっかり忘れてしまい、初心に返って現在参考書を読みながら取り掛かっていますが、 望むような動作が出来ず大変困っています。下記のようなデータを新規ブックAへある条件でコピーし、 CSVとして保存したく、試行錯誤中です。 (A:1)(G:15)までタイトル行にあったデータが入っている名簿があります。 (G:15)でデータは終了ですが、別の名簿も扱う事があり、別の名簿はデータの終了行は(G:15)とは限りません。 -------------------------------------------------------------- (A列)(B列) (C列) (D列) (E列) (F列) (G列)  No   姓    名  姓カナ  名カナ  年齢  性別  1  2  3  ・  15  空白  空白  空白  空白  空白  空白  空白 -------------------------------------------------------------- コピー条件 (1)データの開始行検索&終了行検索(空白セル) (2)データ内の検索(文字or数字) (3)データの開始行から終了行まで新規ブックAへ下記を繰り返す (4)A列のデータを新規ブックAへコピー (5)タイトル行のデータ入力(A列:同じ)(B列:名前)(C列:カナ) (6)B列+全角スペース+C列のデータを新規ブックAのB列へコピー (7)D列+半角スペース+E列のデータを新規ブックAのC列へコピー (8)G列のデータを新規ブックAのD列へコピー (8)F列のデータを新規ブックAのE列へコピー (9)新規ブックを本ファイル名+YYYYMMDD.csvでデスクトップへ保存 -------------------------------------------------------------- 図々しい質問ですが、具体的なコードのお知恵をお貸し頂けたら大変助かります。どうぞ、よろしくお願いいたします。

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

誤>fnNEW=S_DSKTOP & "\" & ActiveSheet.Parent.Name & "YYYYMMDD" & ".xls" 正しくは、 fnNEW=S_DSKTOP & "\" & ActiveSheet.Parent.Name & "YYYYMMDD" & ".csv" 以上訂正です。失礼しました。 "YYYYMMDD"の処はFormatなんでしょうけれど、「何を?」がわからないので省略。 普通にテキストで出力しても良さそうですよね。 検索の意味が、データ型のことならVarTypeとかで判別して、 文字列なら""を付加したり、 シリアル値なら"YYYYMMDD"にFormatしたり、 そんなことかな? 一応、応用可能にはなってるので、私はここまでにします。

tsp4021
質問者

補足

度々申し訳ありません。折角上記を教えて頂いたので、自分なりに教えて頂いたコードの意味を調べながら、 繰り返し処理に追加したいと思いコードの加筆を実施しているのですが、ReDim関数の意味が中々理解出来ず、 再度アドバイス頂けらと思いまして。実は上記質問のファイルには 下記のようなデータが続いております。 -------------------------------------------------------------- (A列)(H列)  (I列)    (J列)    (K列)   (L列)  No   〒    都道府県  市区町村  番地   アパート名  1  ・  15  空白  空白  空白  空白  空白  空白 -------------------------------------------------------------- 上記H列からL列のデータも、新規ブックのF列に元データの H列のデータをコピー、新規ブックのG列に元データの I列のデータをコピー、と繰り返し処理で行いたく。 そこで大変お手数なのですが、ReDim以降のコードの解説をいただけると大変有難いです。 度々申し訳ありませんが、お知恵を貸して頂けないでしょうか?

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

想像で書いているので違うのでしょうし。 自分が書き易いように書いただけなのであまり参考にならないでしょうけど、 ここがニーズと違うとかの叩き台としてどうぞ。 以下、ActiveSheet(ワークシート)専用、 標準モジュール、XL2000~2003で動作、OSはXP Option Explicit Sub test() Dim vA, vAP, sA Dim i As Long, ub As Long Dim fnNEW As String ' 以下1行、適宣、デスクトップを指定 Const S_DSKTOP = "C:\Documents and Settings\user\デスクトップ" fnNEW = S_DSKTOP & "\" & ActiveSheet.Parent.Name & "YYYYMMDD" & ".xls" vA = Cells(2, 1).CurrentRegion.Resize(, 7).Value ub = UBound(vA) ReDim vAP(1 To ub, 1 To 5) sA = Split(" No. 名前 カナ 年齢 性別") For i = 1 To 5 vAP(1, i) = sA(i) Next i For i = 2 To ub vAP(i, 1) = vA(i, 1): vAP(i, 4) = vA(i, 6): vAP(i, 5) = vA(i, 7) vAP(i, 2) = vA(i, 2) & " " & vA(i, 3): vAP(i, 3) = vA(i, 4) & " " & vA(i, 5) Next i With Workbooks.Add(xlWBATWorksheet) .Worksheets(1).Cells.Resize(ub, 5).Value = vAP .SaveAs fnNEW, xlCSV End With End Sub

tsp4021
質問者

お礼

大変詳しく具体的にコードを記載頂いて、どうもありがとうございます!! 自分が行いたかった事が実現できました!叩き台なんてとんでもなく、 完成版として満足に利用できそうです。 また、XLのバージョンやOSも記載いただき、ありがとうございます。 質問している私側がまず提示すべき情報でしたのに・・・。 私もXLが2003でOSもXPですので問題なく作動できました。 記載頂いたコードをきちんと把握できるよう勉強していきます。 本当に大変助かりました。どうもありがとうございましたm(_ _)m

  • hotosys
  • ベストアンサー率67% (97/143)
回答No.1

こんなのではどうでしょうか? どんな検索をするのかわからないのですが・・・ 文字の場合"山*"とか"*山"とか"*山*"で、部分一致の検索ができます。 .AutoFilter Field:=2, Criteria1:="*山*" '姓 .AutoFilter Field:=6, Operator:=xlAnd, Criteria1:=">=20", Criteria2:="<30" '年齢範囲(複合条件)(20代) .AutoFilter Field:=7, Criteria1:="女" '性別 とすれば「苗字に山が付く20代の女性」と言う検索ができます。 Sub sample() 'オートフィルタで検索 Dim srcSheet As Worksheet Dim dstSheet As Worksheet Dim filterCount As Long Set srcSheet = Sheets("Sheet1") '元データがあるシート If srcSheet.AutoFilterMode = True Then srcSheet.AutoFilterMode = False With srcSheet.Columns("A:G") 'データ内の検索 '.AutoFilter Field:=2, Criteria1:="" '姓 '.AutoFilter Field:=3, Criteria1:="" '名 '.AutoFilter Field:=4, Criteria1:="" '姓カナ '.AutoFilter Field:=5, Criteria1:="" '名カナ '.AutoFilter Field:=6, Criteria1:=20 '年齢 '.AutoFilter Field:=6, Criteria1:=">=65" '年齢範囲 .AutoFilter Field:=6, Operator:=xlAnd, Criteria1:=">=20", Criteria2:="<30" '年齢範囲(複合条件) .AutoFilter Field:=7, Criteria1:="" '性別 filterCount = srcSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count If filterCount = 1 Then MsgBox "データ無し" Exit Sub End If End With '以下の整形と保存部はあまり一般的ではないかも With Worksheets.Add '検索結果を新しいシートに転記 srcSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Destination:=.Range("A1") '整形 .Range("H1").Resize(filterCount, 1).Formula = "=B1&"" ""&C1" .Range("I1").Resize(filterCount, 1).Formula = "=D1&"" ""&E1" .Range("J1").Resize(filterCount, 1).Formula = "=G1" .Range("K1").Resize(filterCount, 1).Formula = "=F1" .Columns("H:K").Copy .Columns("H:K").PasteSpecial Paste:=xlPasteValues .Columns("B:G").Delete .Range("B1:C1").Value = Array("名前", "カナ") 'シートを新しいブックに移動 .Move '新しいブックを保存 ActiveWorkbook.SaveAs Filename:=CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & Format(Now(), "YYYYMMDD"), FileFormat:=xlCSV ActiveWorkbook.Close SaveChanges:=False End With End Sub

tsp4021
質問者

お礼

大変詳しくコードを記載頂き、ありがとうございました。 私が詳しく検索に関する条件等を記載しなかったので申し訳ありませんでしたが、 幅広い検索ニーズに対応できる具体的コードを記載いただき、 こんな事も出来るのか、と脱帽しました。 今回私が行いたい作業とは少々違いましたが、今後やりたいと思っていたい事でしたので、とても有難いです! 上記を理解するためには自分がもっと勉強しないとな、と実感いたしました。 本当にお知恵を貸していただき、どうもありがとうございました。 是非とも参考にさせて頂き、自分でも教えて頂いたコードを把握できるよう勉強していきます。

関連するQ&A

  • 違うブックを参照して、数値を表示するには?

    質問失礼します。 エクセルで保存した違うブックにあるデータから、複数条件で一致するものを検索し、表示することは可能でしょうか? 例えばブック1のG2に、ブック2のE1を表示させたいのですが、 条件が、ブック1のG2がある行の「B2とC2とD2とE2」の数値や文字列、空白などが、一致する行を,ブック2から検索し、その行にある、E1を、ブック1のG2に表示させたいです。 ブック1とブック2の一致させたい範囲 ブック1のB列、C列、D列、E列の行単位のセルと並び方=ブック2のA列、B列、C列、D列の行単位のセルと並び方 求めたい物 ブック2の条件にあったE列のセルをG列に表示したいです。 可能でしょうか? ブック1   A  B  C  D  E  F  G 1    8  a1 50  1 2    8  a1 50       30 3    8  a1 60       20 4    8  a1 70 20 5    3  b5 60 20     3 ブック2   A  B  C  D  E  F 1 8  a1 50    30  2 8  a1 50  1 3         4 8  a1 60    20 5 8  a1 70 20   6 7 3  b5 60 20  3

  • Excel VBAにてデータのある列の指定とブック間コピーについて

    初めまして。Excel VBA初心者です。よろしくお願いします。 以下の表の状態で、たとえば、B列の2行目からデータが使用されている行(以下の例では40行目ですが、ブックの内容により行数が変化します)まで、別のブックにコピーする方法があれば教えて頂きたいです。 すみませんが、よろしくお願いいたします。 A B C D E ------------------------------- 1 あ い う え お 2 い う え お か     ・     ・ ・ 40 a b c d e

  • 一覧表から一行ごとのデータを別ブックに保存するには?

    あまり使用頻度はないかもしれませんが・・・・ (例) ○元になる一覧表のブック(BOOK_1.xls) 1行目:項目  (A1:一連番号 B1:氏名    C1:住所) 2行目:データ1(A2:1     B2:山田太郎 C2:東京都) 3行目:データ2(A3:2     B3:山田次郎  C3:大阪府)    ・    ・ 以降10行目まで同様のデータが入っているとします。 上記のファイルから ○あらかじめ決められた単票形式のブック(FORMAT.xls)  A1:一連番号(文字列) B1:空白  A2:氏名(文字列)   B2:空白  A3:住所(文字列)   B3:空白 を呼び出し ○BOOK_1.xlsの一行目の項目のデータを  FORMAT.xlsの B1 B2 B3 の空白部分にコピーペーストし ○BOOK_1.xlsのA2の一連番号の数字をファイル名として取得  し"1.xls"として新規保存をする。 ○そのあとは10行目までその作業を繰り返し、1.xlsから10.xls  というファイルを10個作成し終了する 以上のようなことが可能でしょうか? 実際は列数は30程度、行数が1500行程度あり、1500ほどの ファイルができるようになるんですけど・・・。 よろしくおねがいします。    

  • 別Bookのデータコピーについて

    Book違いのデータをコピー(Book1のSheet1のI,Jを埋めたい)したいと思います。 Book参考のSheet野菜は空白行が存在し、A3~A90までデータが入っています。 また、Sheet1 H列の名前はBook参考のSheet野菜のA列に必ず存在します。 Book参考はデスクトップにあり、自動で開ける方法にてお願い致します。 元 Book1のSheet1      H    I    J 3   トマト 4   きゅうり      ・      ・ 15   レタス Book参考のSheet野菜      A     B   C    D 3  アスパラガス 300  6/2   長崎県 4   いんげん  400  1/13   鹿児島県    5 6   きゅうり  200  11/6   宮崎県 53   トマト   250  2/26   島根県 90   レタス   300  7/7   佐賀県        ↓ Book1のSheet1      H    I    J 3   トマト   250  2/26 4   きゅうり  200  11/6      ・      ・ 15   レタス   300  7/7 となるように

  • 別のブックからコピーしてきたグラフで、元のデータは新しいブックのものを使いたい

    別のブック(A)からコピーしてきたグラフで、元のデータは新しいブック(B)のものを使いたいのです。お知恵を拝借願います。XPでExcel2003です。 具体的には、日報のように、1日ごとに項目は同じ別のブックを作っている場合です。1つのブックは「元データシート」と「日報グラフ」で成り立っています。グラフは数種に渡り、系列も各グラフに10ずつと、多いです。 ブックAで新しい種類のグラフを追加したので、既存のブックB、C、・・・(30くらいのファイル)にも同じグラフを追加したいのですが、AからグラフだけをコピーしてBに貼り付け(形式を選択して貼り付けはできない)すると、 Bのグラフの元のデータは「=’[A]日報グラフ’E11:E1000」(例えばE列の場合)となってしまいます。 これをただの「=’日報グラフ’E11:E1000」にさせることはできませんか?? つまり、コピー元のAを参照したくなく、貼り付け先の同じブックのデータを仕様したいのです。 「グラフの体裁と範囲指定だけを流用したい」という考え方でもかまいません。 過去にも同じような悩みを持つ質問者がいたようですが、未解決のようですので、わかる方、お願いします。 (元のデータを1つずつ修正していくのは大変です。)

  • ExcelVBA別フォルダにあるブックのコピー方法

    ExcelVBAでデータを条件に応じてコピーしたいと思っています。 同一階層に「VBAファイル.xls」「1_フォルダA」「2_フォルダB」「3_フォルダC」があります。 「1_フォルダA」と「2_フォルダB」には年代別に分かれたファイルがあります。 ファイルとフォルダの構造は以下の通りです。 VBAファイル.xls 1_フォルダA  ∟1999_ファイルA.xls  ∟2000_ファイルA.xls  ∟2001_ファイルA.xls  ∟2002_ファイルA.xls  ∟2003_ファイルA.xls  ∟2004_ファイルA.xls  ∟2005_ファイルA.xls  ∟2006_ファイルA.xls  ∟2007_ファイルA.xls  ∟2008_ファイルA.xls  ∟2009_ファイルA.xls  ∟2010_ファイルA.xls  ∟2011_ファイルA.xls  ∟2012_ファイルA.xls 2_フォルダB  ∟1999_ファイルB.xls  ∟2000_ファイルB.xls  ∟2001_ファイルB.xls  ∟2002_ファイルB.xls  ∟2003_ファイルB.xls  ∟2004_ファイルB.xls  ∟2005_ファイルB.xls  ∟2006_ファイルB.xls  ∟2007_ファイルB.xls  ∟2008_ファイルB.xls  ∟2009_ファイルB.xls  ∟2010_ファイルB.xls  ∟2011_ファイルB.xls  ∟2012_ファイルB.xls 3_フォルダC  ∟ファイルC_結果.xls 「VBAファイル.xls」では添付の画像のような「ActiveXコントロール」を設定しました。 コンボボックスで西暦を選択すると、選択した年を中心年として、 前後1年を合わせて合計3年がラベルに表示されます。 その年のファイルのデータが「ファイルC_結果.xls」にコピーされるようにしたいです。 例えば画像のように「2007」を選択した場合、 ・「2006_ファイルA.xls」のC7~C25を「ファイルC_結果.xls」のD7~D25にコピー ・「2007_ファイルA.xls」のC7~C25を「ファイルC_結果.xls」のE7~E25にコピー ・「2008_ファイルA.xls」のC7~C25を「ファイルC_結果.xls」のF7~F25にコピー ・「2006_ファイルB.xls」のC6~C24を「ファイルC_結果.xls」のH7~H25にコピー ・「2007_ファイルB.xls」のC6~C24を「ファイルC_結果.xls」のI7~I25にコピー ・「2008_ファイルB.xls」のC6~C24を「ファイルC_結果.xls」のJ7~J25にコピー というようにしたいです。 「ファイルC_結果.xls」のD/E/F列はファイルAのデータで、 D列は前年、E列は当年、F列は翌年 H/I/J列はファイルBのデータで、 H列は前年、I列は当年、J列は翌年の値をコピーして貼り付けたいです。 また、可能であれば「ファイルC_結果.xls」は原本なので、 値をコピーする際にファイル名が変更できればよりよいです。 いろいろ書いてしまい、うまく伝わっているか不安なのですが 処理するデータが多くとても困っています。 お知恵のある方、どなたか助けていただけますと幸いです。 よろしくお願いいたします。

  • 振り分けて、別ブックの 「 同レコードの番号 」 に貼り付けるには?

    「 ブック1 」 の3つ ( 変動あり ) の集合 ( 上から空白セルを挟んで、集合1、集合2、集合3 ) を 「 ブック2 」 へ  集合1 → B列    集合2 → C列    集合3 → D列 と、 「 同レコードの番号 」 に貼り付けるには、どのようなコードになりますでしょうか? (空白セルを入れたほうが、作業しやすいと私自身が思って、挿入しました。 また、2つのブックのA列の数字の最大値は 12 です。) 難しくて困っております。 何卒、ご教授願います。 ------------------------ 【ブック1】 A     B     C     D    ・     ・    ・     ・   8   ああ   7   ああ 4   ああ 3   ああ 1   ああ 12  ああ 11  ああ 4   ああ 2   ああ 10  ああ 9   ああ 8   ああ 6   ああ 5   ああ  ---- 【ブック2】 A    B    C    D     E・・・  1   ああ 2         ああ 3   ああ   4   ああ  ああ     5              ああ     6              ああ    7   ああ      8   ああ         ああ  9              ああ 10             ああ 11        ああ  12        ああ

  • 別ブック2列がマッチした文字を入力する

    BブックのC列7行目から文字(15ステップ毎文字が入替る)がまたF列8行目からは年月(2017/4~2018/3)、AブックのA列4行目から年月がまたB列4行目からは文字が添付のように連続して入力されています。BブックC列文字とAブックB列文字が一致、BブックF列年月とAブックA列年月が両方一致した行のAブックC列の文字をBブックのE列に順々に入力していきたいのですが。 どなたかVBAコードが解る方ご教授願います。 環境はwindows7 office2013です。

  • ExcelVBAで複数セルを別シートに貼り付けたい

    Excel VBAでデータをコピーして、別シートに貼り付けるどうしたらいいのでしょうか。 Sheet1のセルA1からA4のデータをコピーして、Sheet2のC2からc5に貼り、次はSheet1のセルB1からB4のデータをコピーしてSheet2のC7からc10に貼りを500行ほど繰り返し(コピーするデータは、4行づつ横へ移動し、貼り付けるほうは4行づつ縦へ移動します。) それが終わったら、今度はB列、c列と100列ほど同じ操作を繰り返します。 いろいろな方法を試しましたが、なかなかうまくいきません。 どなたか教えていただけませんでしょうか。よろしくお願いいたします。

  • VBA 他シートを参照しているセルのコピー

    お世話になります。 以下のシートがあります。 [sheet a]    A     B        C      D     E 1 2004 2005 2006 2007 2008 2 =b!A2 =b!C2 =b!E2 =b!G2 =b!I2 3 10 15 16 4 11 4 12 30 20 9 2 5 =SUM(A3:A4) =SUM(B3:B4) =SUM(C3:C4) =SUM(D3:D4) =SUM(E3:E4) [sheet b] A B C D E  F G H I J 2004 2005 2006 2007 2008 1 あ1 い1 う1 え1 お1 か1 き1 く1 け1 こ1 2 あ2 い2 う2 え2 お2 か2 き2 く2 け2 こ2 ・・・・・・・・・ [sheet a]F列以降に入れるデータは、VBA(マクロ)を使って、別のブックから取り出しています。 (例) F1…=E1+1(E1の数式をコピー) F3,F4…任意の値(別のブックからコピー) F5…=SUM(F3:F4)(E5の数式をコピー) 1行目,5行目の場合は左のセルをコピーして数式を貼り付けると、列が自動的に列が変わりますが、2行目の場合は元のシートを1行おきに参照しているので、単純にコピーしただけでは正しい数式が入りません。 2行目の参照をVBAで作るには、どのようにしたらいいでしょうか。 よろしくお願いします。

専門家に質問してみよう