エクセルについて教えてください。

1~n個のエクセルファイルの記入データー(データーは○、×、①~⑤など定型)
の個数を串刺し集計する方法をご存知の方いらっしゃいましたら教えてください。
エクセル2003使用。
各エクセルファイルのファイル名は異なるがシート名は同じで、データーが入力されているセルも同じ。

以上よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2009/03/14 14:50:37
  • 終了:2009/03/17 20:40:59

ベストアンサー

id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912009/03/14 16:56:22

ポイント200pt

では、データを集計するデータです。

集計シートを用意し、1行目にB1から集計対象のセルの位置を下記のように書いてください。


  A B C D ...
1 C3 D5 D7 E4 ...

A列にはファイル名が入ります。各ファイルの指定シートの1行目で指定した値を集計しますが

それを使って集計してはどうでしょうか。

Const FolderPath = "C:\Data"
Const SheetName = "集計"

Sub getData()
    Dim dstWS As Worksheet
    Set dstWS = ActiveSheet
    
    Dim srcWB As Workbook
    Dim srcWS As Worksheet
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim ff As Object
    Dim tr As Long
    tr = 2
    Dim c As Long
    For Each ff In fso.getFolder(FolderPath).Files
        If UCase(fso.GetExtensionName(ff.Path)) = "XLS" Then
            
            Set srcWB = Workbooks.Open(ff.Path)
            Set srcWS = srcWB.Worksheets(SheetName)

            dstWS.Cells(tr, "A").Value = Replace(LCase(ff.Name), ".xls", "")
            c = 2
            Do While dstWS.Cells(1, c).Value <> ""
                dstWS.Cells(tr, c).Value = srcWB.Worksheets(SheetName).Range(dstWS.Cells(1, c).Value).Value
                c = c + 1
            Loop
            srcWB.Close
            tr = tr + 1
        End If
    Next
End Sub
id:dongwu

MooKさん、何度も細かく説明していただき有難うございます。

私の説明不足ですみません。

アンケートのような形で、複数の項目があり、その項目ごとに

データーの集計を行いたいのです。

2009/03/16 19:10:58

その他の回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/03/14 15:32:07

ポイント100pt

できなくはないのですがリンクが発生するので、ファイルの変更や追加に対して柔軟に対応できず、

問題が発生する可能性もあります。

対象となるファイル数は多いのでしょうか?


あまり多い数でなければ、対象となるシートを一つのファイルに集め、ブック内で串刺し集計しては

どうでしょうか。

下記はあるフォルダ内にあるシートを一つのブックに集めるマクロです。

Const FolderPath = "C:\Data"
Const SheetName = "集計"

Sub getSheets()
    Dim dstWB As Workbook
    Set dstWB = Workbooks.Add()
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim ff As Object
    For Each ff In fso.getFolder(FolderPath).Files
        If UCase(fso.GetExtensionName(ff.Path)) = "XLS" Then
            Set wb = Workbooks.Open(ff.Path)
            wb.Worksheets(SheetName).Copy before:=dstWB.Worksheets(1)
            wb.Close
            dstWB.Worksheets(1).Name = Replace(LCase(ff.Name), ".xls", "")
        End If
    Next
End Sub

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1110478...

id:dongwu

Mookさん、ご回答いただきありがとうございます。

ファイル数は300程度です。

2009/03/14 16:08:14
id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692009/03/14 16:57:02

ポイント50pt

ファイル数が300ということで、1つのブックにまとめるのは現実的ではないようですので、

VBAで個々にカウントするコードにしてみました。

セルごとに指定したデータの数をカウントして表示しています。

(そのため同じセルの位置に○と×のように違うデータがあっても合計しています。)


Excelのあるフォルダのパス、シート名、データの種類を実際の値に変更して実行してみてください。


Sub CountData()
    'Excelファイルのあるフォルダを指定
    Const FolderPath = "C:\Documents and Settings\hogehoge\デスクトップ\test"
    '集計するシート名を指定
    Const SheetName = "Sheet1"
    
    Dim i As Integer
    Dim str As String
    Dim wb As Workbook
    Dim r As Range
    Dim fso As Object
    Dim ff As Object
    Dim myData As Variant
    Dim sh As Worksheet
    
    Set sh = ActiveSheet
    
    'カウントするデータを種類を指定してください
    myData = Array("○", "×", "①", "②", "③", "④", "⑤")
        
    Set fso = CreateObject("Scripting.FileSystemObject")

    For Each ff In fso.getFolder(FolderPath).Files
        If UCase(fso.GetExtensionName(ff.Path)) = "XLS" Then
            Set wb = Workbooks.Open(ff.Path)
                For Each r In wb.Worksheets(SheetName).UsedRange
                    For i = 0 To UBound(myData)
                        If r.Value = myData(i) Then
                            sh.Range(r.Address).Value = sh.Range(r.Address).Value + 1
                        End If
                    Next i
                Next
            wb.Close
        End If
    Next
    
End Sub
id:dongwu

SALINGERさん

詳細に有難うございます。

私の説明不足ですみません。

○と×のような違うデーターは、データー毎に集計したいのです。

あとアンケートのような形で、複数の項目があり、その項目ごとに

データーの集計を行いたいのです。

2009/03/16 19:08:56
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912009/03/14 16:56:22ここでベストアンサー

ポイント200pt

では、データを集計するデータです。

集計シートを用意し、1行目にB1から集計対象のセルの位置を下記のように書いてください。


  A B C D ...
1 C3 D5 D7 E4 ...

A列にはファイル名が入ります。各ファイルの指定シートの1行目で指定した値を集計しますが

それを使って集計してはどうでしょうか。

Const FolderPath = "C:\Data"
Const SheetName = "集計"

Sub getData()
    Dim dstWS As Worksheet
    Set dstWS = ActiveSheet
    
    Dim srcWB As Workbook
    Dim srcWS As Worksheet
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim ff As Object
    Dim tr As Long
    tr = 2
    Dim c As Long
    For Each ff In fso.getFolder(FolderPath).Files
        If UCase(fso.GetExtensionName(ff.Path)) = "XLS" Then
            
            Set srcWB = Workbooks.Open(ff.Path)
            Set srcWS = srcWB.Worksheets(SheetName)

            dstWS.Cells(tr, "A").Value = Replace(LCase(ff.Name), ".xls", "")
            c = 2
            Do While dstWS.Cells(1, c).Value <> ""
                dstWS.Cells(tr, c).Value = srcWB.Worksheets(SheetName).Range(dstWS.Cells(1, c).Value).Value
                c = c + 1
            Loop
            srcWB.Close
            tr = tr + 1
        End If
    Next
End Sub
id:dongwu

MooKさん、何度も細かく説明していただき有難うございます。

私の説明不足ですみません。

アンケートのような形で、複数の項目があり、その項目ごとに

データーの集計を行いたいのです。

2009/03/16 19:10:58
  • id:Mook
    300 ですかぁ。
    ちょっと躊躇する数ですね。

    一度集計してしまえば、更新する必要のないデータですか?
    更新がないのであれば、VBA で必要な部分だけ集めて一つの
    シートにまとめてしまうのがよさそうですが。
  • id:dongwu
    Mookさん、コメントありがとうございます。
    一度集計さえしてしまえば、後は更新する必要のないデータです。

  • id:Mook
    B1からと書いておきながら、サンプルの表がA1からになっていましたね。
    あけておいてください。

    全データが集計でき、データが300行 まであったとしたら

    A301(どこでもよいですが)~A307に○、×、①・・・と書き、B301に
    =COUNTIF(B$1:B$300,$A301)
    としてこれを B301:Z307(Zは実際はデータ範囲)にコピーすれば、数ごとの
    集計になるかと思います。
  • id:Mook
    2回目の回答はそのような目的のために回答したのですが、趣旨に合わないでしょうか。

    たとえば各シートの C5セル に項目の回答が書かれているなら、シートの1行目に C5と書いて
    マクロを実行すれば、各シートのC5の値がその列に記載されます。

    その中でどのような数値があるかは、COUNTIF なり SUM なりで集計すればできると思うのですが、
    そのようなやり方はできないのでしょうか。

    各シートの形式がどうなっており、どのようにデータを集計したいかを提示いただければ、
    コメントできるかともいます。
  • id:dongwu
    Mookさん

    ご丁寧にアドバイス有難うございす。

    スンマセン!私の初歩的間違いでした!

    やり直したところ、意図する動作が確認できました。

    本当に有難うございます。

  • id:Mook
    多くのポイントといるか賞ありがとうございました。

    無事できたようでなによりです。

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

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません