http://q.hatena.ne.jp/1206296468

質問者さんのCSVファイルの中身が、いまいちよくわからないのですが、

 185-01.jpg

こんな感じのCSVファイルが、

 185-02.jpg

こんな感じであったとします。

 質問者さんが、「(3000行程有)」と書かれていますので、だいたい3000行入っています。

 IDや世代番号がそのファイル内で重複しているとか、そういうのはわからないので、 とりあえず、ID-世代番号では重複しないデータをダミーで作ってみました。

 IDは a~z , 3000行くらいダミーを作るため、世代番号は1~115になっています。 送信完了日時も適当です。

 抜き出したいID-世代が30項目ほどある、ということなので、 Sheet1に、

 185-03.jpg

こんな風に、A列とB列に抜き出したいID-世代番号を入れたシートを作っておきます。

 このシートの内容に従って、その行数の数の分のシートを作ってみたいと思います。

まず、VBAでシートの追加ってやった事ないので、やってみます。

Yahoo!で「VBA ワークシートの追加」で検索すると、こちらのページが見つかりました。

まず、ワークシート変数を宣言し、Setでその変数にSheets.Addで追加して、その後、名前を変える、という手順のようです。

 シートの一番先頭に、新しいシートを追加してみます。

Sub test()
    Dim tuikaWorksheet As Worksheet

    'ワークシートの追加をします。
    Set tuikaWorksheet = Sheets.Add

    '追加したワークシートの名前を変更します。
    tuikaWorksheet.Name = "A-1"
    End Sub

実行してみると

 185-031.jpg

ん、追加されました(^^) とりあえず、今追加されたシート「A-1」は消しておきます。

んでは、さっきのExcelのSheet1に設定された抜き出し対象のID-世代番号のシートを全部作ってみます。

Sheet1の全行を抜き出すのは、いつもと同じです。

Sub test()
    Dim tuikaWorksheet As Worksheet
    Dim lastgyou       As Integer
    Dim i              As Integer
    Dim tuikaSheetmei  As String
    
    '最後の行を求めます
    lastgyou = Sheets("Sheet1").Range("A1").End(xlDown).Row
    
    '1行目から最後の行まで、Sheet2にコピーします。
    For i = 1 To lastgyou
        
        ' Sheet1 の i 行目の値で追加するシート名をtuikaSheetmeiに代入します。
        tuikaSheetmei = Sheets("Sheet1").Cells(i, 1).Value + "-" + Trim(Str(Sheets("Sheet1").Cells(i, 2).Value))
        
        'ワークシートの追加をします。
        Set tuikaWorksheet = Sheets.Add
        
        '追加したワークシートの名前を変更します。
        tuikaWorksheet.Name = tuikaSheetmei
    
    Next
End Sub

1行ずつ抜き出して、A列とB列の値から、「a-2」のように変更したいシート名を作り、その値をtuikaSheetmeiという変数に代入しています。 B列の値をStr、Trimしてあるのは、B列が数値なので、文字列に変更し、余計な空白が入らないようにするためです。

 実行してみると、

 185-041.jpg

 ん、最後の行の分まで、シートが追加されています(^^)

 でも、、、

追加っていうと感覚的に「一番最後のシートの次に」って感じがしてしまうのは、私だけでしょうか?(^^;)

これだとなんか、「順番が逆」、みたいな感じが(^^;)

いったん、追加されたシートを全部消します。

 さっきのページによると、Addする際に、どこにどうAddするか、を指定できるようです。

 Set tuikaWorksheet = Sheets.Add(After:=Worksheets(“hoge”))

とすると、hogeというシートの後ろに追加できそうです。

 、、、という事は、、、

一番最後のシート名がわかれば、その名前を上記のように指定すればその後ろに追加できそうです。

 ワークシートの名前を取ってくるのは、前にこちらでやりましたが、これは全部のワークシート名を取ってくるやり方ですね。 今必要なのは、一番最後のワークシート名だけなんですけど、それはどうやってとってくればよいのかな?

 Yahoo!で「vba excel ワークシート名 取得」で検索すると、こちらのページが出てきました。

それによると、ワークシートには左から番号がついているらしいですね。

とすると、最後のシート名を取得するには、

ActiveWorkbook.Sheets(最後のシート番号).Name

でよさげですが、今度は最後のシート番号をどうやって取ってくるか、ですね(^^;)

 「最後のシート番号」ってことは、このBookの全シート数ってことですので、シート数を得る方法を探して見ます。

 「vba excel ワークシート数 取得」で検索すると、 こちらのページが見つかりました。

 シート数 = ActiveWorkbook.Worksheets.Count これでいいみたいですね。

というわけで、最後のシートの後ろに追加していく形でやってみます。

Sub test()
    Dim tuikaWorksheet As Worksheet
    Dim lastgyou       As Integer
    Dim i              As Integer
    Dim tuikaSheetmei  As String
    Dim saigoSheetmei  As String
    
    '最後の行を求めます
    lastgyou = Sheets("Sheet1").Range("A1").End(xlDown).Row
    
    '1行目から最後の行まで、Sheet2にコピーします。
    For i = 1 To lastgyou
        
        ' Sheet1 の i 行目の値で追加するシート名をtuikaSheetmeiに代入します。
        tuikaSheetmei = Sheets("Sheet1").Cells(i, 1).Value + "-" + Trim(Str(Sheets("Sheet1").Cells(i, 2).Value))
        
        '最後のシート名を取得します。
        saigoSheetmei = ActiveWorkbook.Sheets(ActiveWorkbook.Worksheets.Count).Name
        
        '最後のシートの後ろにワークシートの追加をします。
        Set tuikaWorksheet = Sheets.Add(After:=Worksheets(saigoSheetmei))
        
        '追加したワークシートの名前を変更します。
        tuikaWorksheet.Name = tuikaSheetmei
    Next
End Sub

 

saigoSheetmeiという変数に、その時点での最後のシート名を取得するようにしました。

 実行してみると、

 185-05.jpg

ん、追加された感じ(^^;)、いいんでないかい?

 ただ。。。 これ、この状態でもう一回プログラムを実行すると、

 185-06.jpg

 エラーになるんですよね(^^;)

プログラムを動かす前にシートを消しておけばエラーは出ないんですけど。

 どうもすでにあるシート名を追加しようとすると、エラーになるようです。

(厳密に言うと、すでにあるシート名にシート名を変更すると、ですが)

まぁ毎回プログラムを動かす前に、シートを消しておけばいいんですが、手動で消すのめんどくさいですよね?(^^;)

ということで抜き出したい データの入っているSheet1以外、全部消してしまうような処理をプログラムの最初に組み込んでみたいと思います。

先ほどのページ の下のほうにシートの削除の仕方ものっていました。

ActiveWorkbook.Worksheets(削除したいシート名).Delete で消せそうです。

ということは今のBookの全てのワークシート名を調べて、それがSheet1以外だったら消す、みたいな感じですね。

全部のシート名を抜き出すのは、さっきも書きましたがここでやりました。

Sub test()
    Dim tuikaWorksheet As Worksheet
    Dim lastgyou       As Integer
    Dim i              As Integer
    Dim tuikaSheetmei  As String
    Dim saigoSheetmei  As String
    Dim objSheet       As Object
    
    'Sheet1以外のシートを全部消します。
    Application.DisplayAlerts = False
    For Each objSheet In ActiveWorkbook.Sheets
        If objSheet.Name <> "Sheet1" Then
            ActiveWorkbook.Worksheets(objSheet.Name).Delete
        End If
    Next
    Application.DisplayAlerts = True
    
    '最後の行を求めます
    lastgyou = Sheets("Sheet1").Range("A1").End(xlDown).Row
    
    '1行目から最後の行まで、Sheet2にコピーします。
    For i = 1 To lastgyou
        
        ' Sheet1 の i 行目の値で追加するシート名をtuikaSheetmeiに代入します。
        tuikaSheetmei = Sheets("Sheet1").Cells(i, 1).Value + "-" + Trim(Str(Sheets("Sheet1").Cells(i, 2).Value))
        
        '最後のシート名を取得します。
        saigoSheetmei = ActiveWorkbook.Sheets(ActiveWorkbook.Worksheets.Count).Name
        
        '最後のシートの後ろにワークシートの追加をします。
        Set tuikaWorksheet = Sheets.Add(After:=Worksheets(saigoSheetmei))
        
        '追加したワークシートの名前を変更します。
        tuikaWorksheet.Name = tuikaSheetmei
    Next
End Sub

削除する前の、 Application.DisplayAlerts = False は、シートを削除する際の確認のメッセージを表示しないようにするものです。削除の処理が終わったら、Trueに戻して、メッセージを表示するようにしています。

 実行してみると、今度はエラーが表示されず、

 185-07.jpg

 Sheet1以外は全部消えています(^^)

ふぅ、ここまででようやく抜き出したいデータのシート(まだシートだけですが(^^;))はできました。

後はこの出来たシートに、CSVファイルからデータを抜き出してくる必要があります。

ちょっと長くなってきたので、続きはこちら

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha