[[20050314145633]] 『数個のブックを1つにまとめたい』(ワケワカラン) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『数個のブックを1つにまとめたい』(ワケワカラン)

「子1」と「子2」というブックのデーターを「親」と言うブックにまとめたいのです

手作業なら

1.「子1」のブックを開く

2.データーをコピーする

3.親に貼り付け

4.「子2」のブックを開く

5.データーをコピーする

6.親に貼り付ける(子1の下)

これをマクロ等でやりたいのです。

データーの行はそのつど違います。ので、子2の始まりは子1のデーターの下につけたい

です。

よろしくお願いします


今、単語検索で同じようなものを発見しました。

もう少し悩んでみます。

検索の単語が違うとなかなかみつからなかったので、質問をさせていただきました。

すみません

(ワケワカラン)


やはり、難しいです。

Option Explicit

Public Sub DataCollection()

    Dim i As Long 
    Dim vntBookName As Variant 
    Dim wkbData As Workbook 
    Dim wksData As Worksheet 
    Dim wkbResult As Workbook 
    Dim wksResult As Worksheet 

    '転記元Bookを取得(複数選択) 
    If Not GetReadFile(vntBookName, ThisWorkbook.Path, True) Then 
        Exit Sub 
    End If 

    Application.ScreenUpdating = False 

    'データを書き込むBookを設定 
    Set wkbResult = ThisWorkbook 

    '選択されたBook全てに就いて繰り返し 
    For i = 1 To UBound(vntBookName) 
        'BookをOpenしする 
        Set wkbData = Workbooks.Open(vntBookName(i)) 
        With wkbData 
            'OpenしたBookのSheet全てに就いて繰り返し 
            For Each wksData In .Worksheets 
                'もし、書き込むシートが無い場合シートを追加 
                If Not GetWriteSheet(wksData.Name, wksResult, wkbResult) Then 
                    Set wksResult = wkbResult.Worksheets.Add 
                    wksResult.Name = wksData.Name 
                End If 
                'データを書き込み 
                DataWrite wksData, wksResult 
            Next wksData 
            'BookをClose 
            .Close SaveChanges:=False 
        End With 
    Next i 

    Set wkbData = Nothing 
    Set wksData = Nothing 
    Set wksResult = Nothing 
    Set wkbResult = Nothing 

    Application.ScreenUpdating = True 

    Beep 
    MsgBox "処理が終了しました" 

End Sub

Private Sub DataWrite(wksData As Worksheet, wksWite As Worksheet)

    Dim lngRows As Long 
    Dim lngWite As Long 

    '書き込むSheet 
    With wksWite 
        '最終行を取得 
        lngWite = .Cells(65536, "B").End(xlUp).Row 
        If lngWite = 1 And .Cells(1, "B").Value = "" Then 
            lngWite = 1 
        Else 
            lngWite = lngWite + 1 
        End If 
    End With 

    'データの有るSheet 
    With wksData 
        '最終行を取得 
        lngRows = .Cells(65536, "B").End(xlUp).Row 
        'データをCopy 
        .Cells(1, "B").Resize(lngRows, 11).Copy _ 
                Destination:=wksWite.Cells(lngWite, "B") 
    End With 

End Sub

Private Function GetWriteSheet(strName As String, _

                                wksWrite As Worksheet, _ 
                                wkbWrite As Workbook) As Boolean 
'   Sheetの存在確認 

    Dim wksResult As Worksheet 
    Dim blnExist As Boolean 

    '書き込むBookに就いて 
    With wkbWrite 
        'WorkSheet全てに就いて繰り返し 
        For Each wksResult In .Worksheets 
            'もし、シート名が有るなら 
            If wksResult.Name = strName Then 
                '戻り値をTrueに 
                blnExist = True 
                '書き込みSheetを返す 
                Set wksWrite = wksResult 
                Exit For 
            End If 
        Next wksResult 
    End With 

    GetWriteSheet = blnExist 

End Function

Private Function GetReadFile(vntFileNames As Variant, _

                        Optional strFilePath As String, _ 
                        Optional blnMultiSel As Boolean _ 
                                        = False) As Boolean 

    Dim strFilter As String 

    'フィルタ文字列を作成 
    strFilter = "Excel File (*.xls),*.xls," _ 
                    & "全て (*.*),*.*" 
    '読み込むファイルの有るフォルダを指定 
    If strFilePath <> "" Then 
        'ファイルを開くダイアログ表示ホルダに移動 
        ChDrive Left(strFilePath, 1) 
        ChDir strFilePath 
    End If 
    'もし、ディフォルトのファイル名が有る場合 
    If vntFileNames <> "" Then 
        SendKeys vntFileNames & "{TAB}", False 
    End If 
    '「ファイルを開く」ダイアログを表示 
    vntFileNames _ 
            = Application.GetOpenFilename(strFilter, 1, , , blnMultiSel) 
    If VarType(vntFileNames) = vbBoolean Then 
        Exit Function 
    End If 

    GetReadFile = True 

End Function

を貼り付けました。

が、これだと、新しくシートをつくって、そこにコピーになります。

このマクロをくんでいるブックの「まとめ」というシートに貼り付けたいのです。

「まとめ」というシートはすでに作ってあります。

どうしたらいいでしょうか?

(ワケワカラン)


 基本形は次のようなマクロでよいと思います。
  
 Sub TEST_20050314()
    Const MyPath As String = "C:\test\"
    Dim MyBook As Workbook
    Dim MyFileName As String
    Dim MyRng As Range
    MyFileName = Dir(MyPath & "*.xls")

    Do While MyFileName <> ""
        If ThisWorkbook.Name <> MyFileName Then
        Set MyBook = Workbooks.Open(MyPath & MyFileName)

        Set MyRng = ThisWorkbook.Sheets("まとめ").Range("A65536").End(xlUp).Offset(1)
        MyBook.Sheets(1).Range("A1").CurrentRegion.Copy Destination:=MyRng
        MyBook.Close
        End If
        MyFileName = Dir()
    Loop
 End Sub
 
味付けとしては「子1」「子2」のシート名。
(みやほりん)


基本形を貼り付けてみましたが、なにも起こりません。

味付けが下手なのでしょうか.....

"C:\test\"にはコピー元を入れるのでしょうか?

素人ですみません。

最初にコピーするデーターを選択するようにしたいのです。

ちなみにコピーするデーターはCSVデーターです。

(ワケワカラン)


 味付け以前の問題なんですが、
> 1.「子1」のブックを開く
とあったのでそのようにしました。
完全なOutputには正確なInputが必要ですね。
    Const MyPath As String = "C:\test\"
   ・
    MyFileName = Dir(MyPath & "*.xls")
   ・
    MyBook.Sheets(1)Range("A1").CurrentRegion.Copy ・・・・
とあるように、提示のものは
 
「C:\test」のフォルダにある、
  全ての「エクセルブック」の
    「一番左側」のシートの、
      「A1」セルのアクティブセル範囲を
「親」ブックの
  「まとめ」シートへコピー貼り付けするものです。
 
したがって、それら「」の項目のどれかが外れると用をなしません。
 
環境に合わせてカスタマイズしてください。
    Const MyPath As String = "C:\test\" ←CSVの保存してあるフォルダ名パス
    MyFileName = Dir(MyPath & "*.xls") ←"*.xls"を"*.csv"に
(みやほりん)
【追記】
もとのデータをこわすことはないと思い、注意喚起をしなかった私も悪いのですが、
マクロは「それらしきもの」を適当に使うと大切なデータを失う結果にもなるので
他人の作ったコードをそのまま使う時はご用心を。


ありがとうございました。

なんとかできました。

(ワケワカラン)


横からすいません。
 ここにあるマクロをコピーしてやってみたのですが
 なぜかうまいこといきません。
 ブックは30個程度 シートは*4程度(ブックによってバラバラ)程度あると思います。
 ブックの中には表(LIST)とグラフが入っていますが
 LISTしかできないのですが,何か問題あるのでしょうか?
 宜しくお願いします。 (てつ)

 このような掲示板に掲載されているマクロは個々の相談者のために特化したものが
多いので、そのまま他の方が使って良い結果が出るとは思えません。
 
どういう働きをしているマクロなのか、理解できていないものを使用するのは
おやめください。(データが復元できない場合もあるのです)
 
で、二種類のコードのうちどちらを使ったのでしょう。
TEST_20050314ならフォローします。
(みやほりん)(-_∂)b

 最初に掲載されているのはこちらで提案されたもののようです。
http://park7.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200502/05020076.txt
出典:エクセルファンクラブ Q&A ラウンジ
http://www.fuji.ne.jp/~excelyou/
 
INAさんの名前が見えますね。
(みやほりん)(-_∂)b


 少し違いました。
 私の場合はただホルダーに入っている全ファイル中の全シートを
 一つにまとめるだけでよかったのですが・・・
 別に1つのシートにまとめるわけではなく・・・

 っでそこでいろいろやっていたのですが,
 どうしてもうまいこといかないのです。
 例えばファイル101.XLSに
 A101−JPN−LIST,A101-JPN-GRAPH,A101-NAS-LIST,A101-EU-GRAPH
 というシートがあったとします
 そこでマクロを実行するとLISTのシートしか抜き出せないのです。

 実行したマクロはフリーのソフトもそうですが,
 http://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi?mycmd=read&mypage=[[20050210100639]]
 にあるマクロでもそうなってしまいます。
 場所違いですがお願いします。

 GRAPHシートはLISTの表からグラフを作成しているから抜き出せないのでしょうか?
 リンク先で実行したマクロを貼り付けておきます。

 Sub 複数のブックのシートを一つブックにまとめる()
     On Error GoTo ErrorHandler
     Dim strPath As String
     Dim strBookName As String
     Dim TargetBook As Workbook
     Dim OriginalSheet As Worksheet
     '指定した場所にあるxlsファイルについて処理
     strPath = ThisWorkbook.Path '自分自身と同じ場所とする
     strBookName = Dir(strPath & "\*.xls") 'ファイル名取得
     '対象ファイルが存在する限り処理
     Do While strBookName <> ""
         If ThisWorkbook.Name <> strBookName Then '自分自身じゃないなら
             'そのブックを開く
              Set TargetBook = Workbooks.Open(strPath & "\" & strBookName)
             '開いたブックの全てのシートを処理
             For Each OriginalSheet In TargetBook.Worksheets
                 '開いたブックのシートを自身の最後にコピー
                 OriginalSheet.Copy After:=ThisWorkbook.Worksheets   (ThisWorkbook.Worksheets.Count)
                 'コピーしたシートの名前をコピー元ブック名&シート名に変更
                 'ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).Name = TargetBook.Name & OriginalSheet.Name
                 'コピーしたシートの名前をコピー元シート名に変更
                 ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).Name = OriginalSheet.Name
             Next
             '開いたブックを閉じる
             TargetBook.Close
             Set TargetBook = Nothing
         End If
         strBookName = Dir '次のファイル
     Loop
     Exit Sub
 ErrorHandler:
     'エラーが起きたら
     If Not (TargetBook Is Nothing) Then
         TargetBook.Close
     End If
     If Err Then
         MsgBox Err.Number & ":" & Err.Description, vbExclamation
         Err.Clear
     End If
 End Sub

(てつ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.