他のブックの複数シートの〇記号の串刺し集計方法

このQ&Aのポイント
  • エクセルで複数のシートに同じ表のデータがあります。それぞれのシートの〇と×を集計して他のブックの同じ表に集計結果を表示したいです。
  • 31枚のシートの〇と×を数値に変換し、それを串刺し集計するために、CountIfAcrossというユーザ定義関数を使用します。
  • CountIfAcross関数を使って、シート区間の先頭セルと後尾セル、検索条件を指定してカウントした数を返します。
回答を見る
  • ベストアンサー

他のブックの複数シートの〇記号の串刺し

エクセルで次のような表のデータが1ヶ月分、31日分あり ます。すなわち31枚のシートに同じ表で中の○× の内容が違うデータがあります。〇×は単純に「まる」「ばつ」と入力して変換したものです。   ア イ ウ エ オ (1) 〇 × × 〇 〇 (2) 〇 × 〇 〇 × (3) × 〇 〇 〇 × (4) 〇 〇 × × 〇 そして〇をゼロ、×を1と数えて、 31枚のシートの〇と×を集計して他のブックの 同じ表に集計の結果を示したい のです。 例えばこんな感じで他のブックのシート の同一の表に計算結果を表示したいです。 ア イ ウ エ オ (1) 7 4 5 0 0 (2) 8 5 0 2 2 (3) 1 1 0 1 0 (4) 0 0 4 6 8 31枚のシートの〇と×を数値に 変換し、それを串刺し集計した いのです。 countifは串刺し集計 で使えないので 次のようなユーザ定義関数を教えて戴き、同じブックの32枚目のシートの同じ表に 集計が可能となり誠に教えて戴いた方には感謝する次第では御座いますが、 他のブックの同一の表に集計するには、ユーザ定義関数の記述をどのようにすれば よろしいでしょうか。宜しくお願い致します。 Public Function CountIfAcross(シート区間先頭セル As Range, シート区間後尾セル As Range, 検索条件 As String) Dim sRef As String, sRefE As String, c As Range, cnt As Long, i As Long   sRef = シート区間先頭セル.Address(0, 0)   sRefE = シート区間後尾セル.Address(0, 0)   If sRefE <> sRef Then sRef = sRef & ":" & sRefE   For i = シート区間先頭セル.Worksheet.Index To シート区間後尾セル.Worksheet.Index     For Each c In Sheets(i).Range(sRef)       If c.Text Like 検索条件 Then cnt = cnt + 1     Next   Next i   CountIfAcross = cnt End Function 普通のExcel関数のように、 =CountIfAcross(Sheet1!B2,Sheet31!B2,"×") =CountIfAcross('#1'!B2,'#31'!B2,"×") 等の様に シート区間先頭セル、シート区間後尾セル、検索条件 を指定してカウントした数を返します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

回答No.1です。 こちらの読み方が間違っていましたね。 > 他のブックを参照するにはどういった記述にすれば > よろしいでしょうか。 変更は3ヶ所です。 [シート区間先頭セル]に指定したセル範囲 の存在する ブック の シート区間 を集計の対象にします。 Public Function CountIfAcross(シート区間先頭セル As Range, シート区間後尾セル As Range, 検索条件 As String) Dim sRef As String, sRefE As String, c As Range, cnt As Long, i As Long   sRef = シート区間先頭セル.Address(0, 0)   sRefE = シート区間後尾セル.Address(0, 0)   If sRefE <> sRef Then sRef = sRef & ":" & sRefE   With シート区間先頭セル.Worksheet.Parent ' ★追加     For i = シート区間先頭セル.Worksheet.Index To シート区間後尾セル.Worksheet.Index       For Each c In .Sheets(i).Range(sRef) ' ★1文字追加         If c.Text Like 検索条件 Then cnt = cnt + 1       Next     Next i   End With ' ★追加   CountIfAcross = cnt End Function

itsuroo4185
質問者

お礼

私の意図をくみ取って戴き誠に有難う 御座います。 ご回答戴き感激しております。 自分で検証してからお返事をと思い お礼のコメントが遅れまして 申し訳御座いませんでした。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

 無理してVBAを使わずとも、前問に回答したように思うが、その繰り返しですが 原ブックをコピーして、2ブック用意して (1)全シート(集計シートを除く)を○を1に、×を0に置換 (2)全シート(集計シートを除く)を○を0に、×を1に置換 この際(1)(2)共に、操作はシートタブの第1とSHIFTキーしながら、第30シートをクリックすることで、全シート(集計シートを除く)選択ができて、1回の置換で30シート1辺に済むことです。<==ここが便利なところ あとは「3D集計」でWEB解説ある方法で式を入れれば、そのセル位置の○や×の数が出るはず。 VBAで第1から第30シートまでのい1つの番地位置のセルの○と×の数をカウントしても (総なめ法)で来るが無理しなくても良いのではないか。 === VBAに興味が出たようだが 参考 VBAで○の数がSheet4、×の数がSheet5に出る. データ範囲はA2:D5のテストデータ Sub test01() For Each cl In Worksheets(1).Range("A2:D5") s1 = 0: s2 = 0 For Each sh In Worksheets If sh.Name <> "Sheet4" Or sh.Name = "Sheet5" Then Select Case sh.Cells(cl.Row, cl.Column) Case "○" s1 = s1 + 1 Case "×" s2 = s2 + 1 Case Else End Select End If Next Worksheets("Sheet4").Cells(cl.Row, cl.Column) = s1 Worksheets("Sheet5").Cells(cl.Row, cl.Column) = s2 Next End Sub == 例データ Sheet1 ー 1月 2月 3月 東京支店 ○ × × 名古屋支店 ○ ○ × 大阪支店  × ○ Sheet2 - 1月 2月 3月 東京支店 ○ × × 名古屋支店 × × ○ 大阪支店  × ○ ○ Sheet3 - 1月 2月 3月 東京支店 ○ × ○ 名古屋支店 × ○ 大阪支店  × ○ ○ === 実行結果 Sheet4 B3:D5 ○のセルごと数 3 0 1 1 2 1 0 3 2 Sheet5 B3:D5 ×のセルごと数 0 3 2 2 1 1 3 0 0 == コード行数を少なくすることを第1としてコードを書いたので、見出し部分など省いている。

itsuroo4185
質問者

お礼

imogasiさんの仰られる通り検索置換で出来たので無理せず VBAを使う必要はないのですが、VBAを使うとどうなる のかなぁと興味がわいてきまして、全くimogasiさんに千里眼 で心を見透かされているような気持になりました。 今回回答戴いて、VBAを勉強するきっかけになり、 誠に感謝しております。 お返事が遅れまして大変申し訳御座いませんでした。

回答No.1

こんにちは。 Q『複数のシートの○×記号の串刺し集計』 http://okwave.jp/qa/q9182888.html コメントを投稿しました。 コメント文を書いている間に新しい質問立てていたのですね。 行き違いがあったようで、失礼しました。 ユーザー定義関数(UDF)をアドインブックとして保存して、 Excelメニューからアドイン登録して、Excel再起動、です。 手順を踏めば、どのブックからでもUDFを使えるようになります。 コメント欄に書いた内容 |  | 新しいブック | →標準モジュールを挿入 | →UDFを貼付け | →アドイン(*.xlam,*.xla)ブックとして名前を付けて保存 | →保存したアドインブックを閉じる |  | → | [Excel][開発][アドイン]保存したアドインを登録 | →Excel再起動 |  | ■検索キーワード『excel ユーザー定義関数 アドイン』■ もしわからないところがあったら、とりあえずやってみて、 何処が解らなかったか、補足欄にでも書いてみて下さい。 一応、問題や課題が解決することが目標ですから、 ご自身で解決を確認(検証)し終わるまで、 或いは回答者が後から気が付いたことを伝えたい時もあるので、 少し(1日とか)時間を開けてから締め切るとベターで、 寧ろ好感を持って回答者からも受け入れられ易いと私は思いますです。 とりあえず以上です。

itsuroo4185
質問者

お礼

アドインの仕方を教えて戴き誠に有難う御座います。 実際に出来るとなんだか自信がつきます。 今回realbeatinさん方々のお陰でVBAを勉強して みようというきっかけになりました。 本当に有難う御座います。

関連するQ&A

  • 複数のシートの○×記号の串刺し集計

    エクセルで次のような表のデータが1ヶ月分、31日分あり ます。すなわち31枚のシートに同じ表で中の○× の内容が違うデータがあります。 ア イ ウ エ オ (1) ○ × × ○ ○ (2) ○ ○ ○ × × (3) × × ○ ○ ○ (4) ○ × × ○ ○ そして○をゼロ、×を1と数えて、 31枚のシートの○と×を集計して 32枚目のシートに結果を示したい のです。 例えばこんな感じ32枚目のシート に計算結果を表示したいです。 ア イ ウ エ オ (1) 7 4 5 0 0 (2) 8 5 0 2 2 (3) 1 1 0 1 0 (4) 0 0 4 6 8 31枚のシートの○と×を数値に 変換し、それを串刺し集計した いのです。countifは串刺し集計 で使えないようですし、上手い やり方があれば、教えて戴き たいです。 宜しくお願い致します。

  • 串刺し計算エクセル 一部シートをメールに添付したい

    excel2003を使用しております。 book内に15シートほどの集計表があり そのうち1シートは全シートを串刺し計算した総集計です。 その総集計の1シートのみをメールで送信したい場合 どうやって送ればいいのでしょうか。 串刺し計算の入っているすべてのシートを送るしかないのでしょうか。 お時間あるかたいらっしゃいましたら 回答よろしくお願いいたします。

  • Excelのブック間の串刺し計算について

    Excelのブック間の串刺し計算について VBA超初心者です。同じフォルダ内にファイルがいくつかあり、同じ形式で、sheet1のB4のセルに計があったとして、それをブック間で串刺し集計したいのですが、うまくいきません。どこが悪いのかもわからず、困り果ててます。ご指導お願いします。 Sub BookShuukei() Dim FileName As String Dim Total As Integer Dim OpenedBook As Workbook Dim IsBookOpen As Boolean FileName = Dir("*.xls") Application.ScreenUpdating = False Do While FileName <> "" If FileName <> ThisWorkbook.Name Then IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If Total = Total + Workbooks(FileName).Sheets(1).Range("B4").Value If IsBookOpen = False Then Workbooks(FileName).Close End If End If FileName = Dir() Loop Application.ScreenUpdating = True MsgBox (Total) End Sub

  • シートを串刺しで抽出したいのですがそれはマクロですか?

    こんにちは。 エクセルの串刺し集計ではなく、串刺し抽出のことでわからないので 教えて下さい。 ・同じブック内に顧客20件のデータが管理されています。 ・1シート毎が1顧客の単価帳になっています。 ・A1に顧客の名前(同じくシート名もこれと同じく顧客の  名前をつけています。) ・抽出したいのは顧客20件の各シートのA50:B53です。 同じブックの新規シートに「A1の顧客名」と(どれを抽出したか わからなくなってしまうから必要なのかな?と思います。) 20シート全ての「A50:B53」を抜き出すことは可能でしょうか? 抜き出したいセル番地は20シート一緒です。 それぞれのシートはA2からA49までの抽出しなくてもいいセルは、  不規則にだらだらと製品名や個々の単価が入力されています。 転職した会社でデータ管理がなされていなくてビックリしています。 とは言え私もマクロなどは経験がなく、なにをしたらできるのかが さっぱり分かりません。 でも確か前の会社ではできていたのに・・・? あれはアクセスだったのかなぁ? などという状態です。 VBAマクロの本を読みあさりましたが よくわかりませんでした。 とっかかりを教えていただければありがたいです。 よろしくお願いします。

  • シートの自動追加を新規ブックで実行したい

    こんばんは。 いつもお世話になっています。 営業月報を作成したいと思い、色々お知恵を借りながら試しています。 Sheet1:チームのメンバー表 Sheet2~3:名簿と目標値 Sheet4:月報の原版 このような構成のブックで、毎月Sheet1のメンバー表を書き換え(名簿ファイルから直接コピペでA1セルから下に向かってメンバーの名前)、 下記のマクロを実行してSheet4を複製しています。 今はこの追加を同じブック内で最後尾へどんどん追加しているのですが、複数のチームで共有する都合を考え、Sheet1にコピペしたメンバーの月報は新規ブックを自動で起こしてシートを追加したいと思っています。 ******************************* Sub シート追加() Dim 追加シート名 As String Dim i As Integer For i = 1 To Sheets("Sheet1").Range("a1").End(xlDown).Row 追加シート名 = Sheets("Sheet1").Cells(i, 1).Value Sheets("Sheet4").Copy After:=Sheets(Sheets.Count) Sheets("Sheet4" & " (2)").Name = 追加シート名 Next End Sub ******************************* 現在使用しているマクロはこのような内容なのですが、新規ブックでシートの追加をするには、どのようにすればよいのでしょうか? よろしく御教示をお願いします。

  • フォルダ内の複数ブックのデータとブック名を転記する

    フォルダの中に複数のExcelファイル(ブック)が入っており、 それら全てのブックデータの転記を一括して行うマクロを現在使用しています。(後述) <現在の利用状況> ・フォルダの中に複数のExcelファイル(ブック)が入っている。ファイルにつきシートは1つ(ひな形は同じ) ・ファイルを確認するまでデータが何行入っているか分からない ・貼り付ける際はシートの上部は意図的に消している <改善希望> ・どのファイルから貼り付けたか分かるように、A列にファイル名を追記したい(どの行にも) ・できれば先頭の3文字のみ VBA勉強中の初心者ですが、なるべく早く実装しないといけないので、困っています。。。。 ご教示頂けます様お願いいたします。 ========================= Sub データ集計() '集計シートを変数に格納 Dim ws As Worksheet Set ws = ActiveSheet '集計シートの最終行を取得 Dim LastRow As Long LastRow = ws.Cells(Rows.Count, 5).End(xlUp).Row MsgBox "このブックと同じフォルダにあるブックを全て統合します" 'このブックの保存されているフォルダのパス(番地;ディレクトリ)を変数に取得 Dim thisPath As String thisPath = ThisWorkbook.Path 'ディレクトリにあるExcelのファイル名を取得 Dim fileName As String fileName = Dir(thisPath & "\" & "*.xlsx") Dim i As Long 'ファイル名が無くなるまで繰り返す Do While fileName <> "" '開くワークブックを変数に代入 Dim bufBook As Workbook Set bufBook = Workbooks.Open(thisPath & "\" & fileName) '開いたブックの第1シートの全データ --> 集計シートの最終行 bufBook.Worksheets(1).Range("B14").CurrentRegion.Copy Destination:=ws.Range("B" & LastRow) '最初のループ以外では、タイトル行を削除しておく Dim LastRowSecond As Long LastRowSecond = LastRow + 13 If i > 0 Then ws.Rows(LastRow & ":" & LastRowSecond).Delete End If '開いたブックを閉じる bufBook.Close SaveChanges:=False '集計シートの最終行を再取得しておく LastRow = ws.Cells(Rows.Count, 7).End(xlUp).Row + 1 '次のファイル名が取り出される。 fileName = Dir() i = i + 1 Loop End Sub

  • エクセル、ブック間でのデータ読込

    教えてください。 Excel2010を使っています。  動作:閉じているブックからデータを読み出し、開いているブックに貼付けることです。  詳細:閉じているブック’2014_9月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215のデータを      開いているブック’2014集計.xlsx、シート’集計’、セル’B20~C35・D20~D35に貼付けをた      いのですが。      応用1.        閉じているブック’2014_9月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215         ↓        開いているブック’2014集計.xlsx、シート’集計’、セル’B20~C35・D20~D35        閉じているブック’2014_10月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215         ↓        開いているブック’2014集計.xlsx、シート’集計’、セル’B40~C55・D40~D55        閉じているブック’2014_11月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215         ↓        開いているブック’2014集計.xlsx、シート’集計’、セル’B60~C75・D60~D75        ・        ・        ・        閉じているブック’2015_9月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215         ↓        開いているブック’2015集計.xlsx、、シート’集計’、セル’B20~C35・D20~D35        それぞれのブックは事前に作成します。’2014_9月.xlsx’、’2014_10月.xlsx’、’2014_11        月.xlsx’、’2015_9月.xlsx’、’2014集計.xlsx、’2015集計.xlsx      応用2.        現状        閉じているブック’2014_9月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215         ↓        開いているブック’2014集計.xlsx、シート’集計’、セル’B20~C35・D20~D35        開いているブック’2014集計.xlsx、シート’集計’セルB19’年’、セルC19’月’を変更する        ことにより        変更        閉じているブック’2014_10月.xlsx’、シート’AAA’、セル’C200~D215・I200~I215         ↓        開いているブック’2014集計.xlsx、シート’集計’、セル’B20~C35・D20~D35        と言うことは可能でしょうか。 エクセルのマクロは初心者で苦労をしています、ご教授頂ければ幸いです。 よろしくお願いいたします。        

  • VBAで複数シートを新たに作成したBookにコピー

    いつも大変お世話になります。動作環境は、WindowXPSP3、EXCEL2010です。10個の名前付きsheetがあります。Book.xlsmから新たにBook1.xlsxを作成してこのBook1.xlsxに1個のsheet名が「sheet1」を作成します。そして、Book.xlsmにある10個の名前付きsheetをBook1.xlsxに作成した一個のsheet1にコピーします。コピーの仕方は、Book.xlsmの一番左端のsheetから順番にBook1.xlsxに作成した1個のsheet1に下から上に向かってコピーしていきます。最終的には、10個の名前付きsheetが纏められます。後一つの条件は、一番最初にコピーするシートには4行目に項目書かれております。なので、一番最初にコピー4行目だけはコピーして、後は、5行目からコピーしたく、下記のマクロを作成しました。 Option Explicit Option Base 1 Public Sub シートの纏め() Dim i As Long Dim mySheetCnt As Long Dim mySheetName() As String Dim ws As Workbook Dim s As Worksheet '========================================================================== mySheetCnt = ThisWorkbook.Sheets.count ReDim mySheetName(1 To mySheetCnt) For i = 1 To mySheetCnt - 3 mySheetName(i) = Sheets(i).Name 'MsgBox "変数mySheetName(" & i & ")=" & mySheetName(i) Next i '========================================================================== Dim EffectiveRow As Long Dim EffectiveColumn As Long EffectiveRow = Range("B65536").End(xlUp).Row 'MsgBox "EffectiveRow = " & EffectiveRow & "" EffectiveColumn = Cells(4, 256).End(xlToLeft).Column 'MsgBox "EffectiveColumn = " & EffectiveColumn & "" '========================================================================== Dim Book1 As Workbook For i = 1 To mySheetCnt - 3 If mySheetCnt = 11 Then GoTo Label1 'MsgBox "mySheetName(i) = " & mySheetName(i) & "" 'MsgBox "デフォルトで" & Application.SheetsInNewWorkbook & "枚作成されます" Workbooks.Add Application.SheetsInNewWorkbook = 1 Sheets("sheet1").Select Book1 = ActiveWorkbook.Name Workbooks("Bookxlsm").Worksheets("mySheetName(i)").Range("B4:AF58").Copy _   Workbooks("Book1.xls").Worksheets("sheet1").Range("B4") ⇐ここで、実行時エラーが出ます。 Next i Label1: End Sub しかし、実行時エラーで止まってしまいます。もう、1週間格闘しております。どなたか、何卒ご教授して頂きたく、宜しくお願い申し上げます。

  • 複数のExcelBookの特定セルの取得

    Excel2003について教えてください。 複数の同じ内容のBookがあり、このBook内のあるシート内のセルの内容を集めて、別のブックにリストを作成したいのですが、別のコンピュータに複数のBookがあり、これを自分のマシンから参照するとすごく時間がかかります。 高速で取り込む方法はないでしょうか? 現在以下のVBAでやっています。 Sub リスト取得() Dim eBookname As String 'Book名 Dim DrvDir As String 'ドライブフォルダ Dim rw As Long '行カウンタ Dim TargetCell0 As String '集計するセル Dim TargetCell1 As String '集計するセル Dim TargetCell2 As String '集計するセル Dim TargetCell3 As String '集計するセル TargetCell0 = "B4" TargetCell1 = "C4" TargetCell2 = "H4" TargetCell3 = "I2" DrvDir = ThisWorkbook.Path & "\" & "Working" & "\" '*** フォルダパスをセットします With Worksheets("一覧") .Range("C4:F65535").ClearContents '表示用のC~F列をクリア rw = 3 'フォルダを検索してxlsファイルを特定する eBookname = Dir(DrvDir & "*.xls") Application.Calculation = xlCalculationManual While eBookname <> "" '順にSheet1に書き出していく rw = rw + 1 .Range("C" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell0 .Range("D" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell1 .Range("E" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell2 .Range("F" & rw) = "='" & DrvDir & "[" & eBookname & "]ワーク'!" & TargetCell3 eBookname = Dir Wend End With Application.Calculation = xlCalculationAutomatic MsgBox "リストを更新しました。" & vbCrLf & vbCrLf & "取得件数 " & rw - 3 & " 件です。", vbInformation, "" End Sub

  • 条件に合うシートを串刺し集計して別のブックに抽出する方法

     ご覧いただきありがとうございます。「条件に合うシートを串刺し集計して別のブックに抽出する方法」を教えてください。  毎月、1件の請求につき1枚のシート、計80枚程度のシートを含む請求○月.xlsというブックを作っています。  現在は、その後の入金や未収の管理は、手作業で別ブック(入金○月.xls や 未収○月.xls)にシートを移すという非効率的な方法に頼っているのですが、この請求4月.xls や 請求5月.xls の各シートに「入金済み」のフラグを立てるなどして、これらのブックから、入金○月.xls が(半)自動的に生成されるようにしたいのです。  言い換えれば、入金された月別に 請求○月.xls からデータを別ブックに抽出したいのです。  具体的には、   請求4月.xls シート1、シート2、・・・、シート80、合計額シート(請求計)   請求5月.xls シート1、シート2、・・・、シート80、合計額シート(請求計)         (入金のあった分のシートを串刺し集計して抽出)         ↓         ↓   入金6月.xls 請求4月入金6月シート、請求5月入金6月シート 上記のように抽出したいと思っています。(串刺し集計のほか、シートを抽出する方法もお教えいただければ幸いです)  なにとぞご指導よろしくお願いいたします。

専門家に質問してみよう