VBAでコントロールブレイクを使ってデータを集計する方法

このQ&Aのポイント
  • Excelでデータを集計する際に、VBAのコントロールブレイク機能を使用する方法を教えてください。
  • 関数を使用して集計を試みましたがうまくいかなかったため、VBAを利用した方法についてお知りたいです。
  • データには空白セルがあり、その場合は「.」と表示されるようにしたいです。関数でもVBAでも実現可能な方法を教えてください。
回答を見る
  • ベストアンサー

vbaでコントロールブレイク

はじめまして。excelでこのようなデータが あります。a列をidごとに集計して以下の結果のように 集計したいのです。集計しなくてもいい行はそのまま 出力します。関数でやってみましたがうまくいかないので VBAにしたいです。データになにも入力されていないセルは "."が入ります。関数でもVBAでもかまいませんので よろしくお願いします。 データ --------------------------- a b c d id1 1 a a . 2 f a . 3 f a 4 f a id2 1 2 4 id3 2 . . ---------------------------- 結果 ------------------------ a b c d id1 1234 afff aaaa id2 1 2 4 id3 2 . . ------------------------

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

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

よくわかりませんが、こういう事でいいんでしょうか。 Private Sub CommandButton1_Click()      Dim strArr(100, 3) As String   Dim sh As Worksheet   Set sh = Sheets("Sheet1")        Dim counter As Integer   counter = 0   Dim index As Integer   Dim i As Integer   For i = 0 To 100     Dim A_Value As String     A_Value = GetCellText(sh, i + 1, 1)     If A_Value = "" Then Exit For        If A_Value <> "." Then       strArr(counter, 0) = A_Value       index = counter       counter = counter + 1     End If          If index <> -1 Then       strArr(index, 1) = strArr(index, 1) & GetCellText(sh, i + 1, 2)       strArr(index, 2) = strArr(index, 2) & GetCellText(sh, i + 1, 3)       strArr(index, 3) = strArr(index, 3) & GetCellText(sh, i + 1, 4)     End If   Next   Set sh = Nothing      Dim sh2 As Worksheet   Set sh2 = Sheets("Sheet2")      Dim j As Integer   For j = 0 To 100     Dim A_Value_2 As String     Dim B_Value_2 As String     Dim C_Value_2 As String     Dim D_Value_2 As String          A_Value_2 = strArr(j, 0)     B_Value_2 = strArr(j, 1)     C_Value_2 = strArr(j, 2)     D_Value_2 = strArr(j, 3)          If A_Value_2 = "" Then Exit For          Call SetCellText(sh2, j + 1, 1, A_Value_2)     Call SetCellText(sh2, j + 1, 2, B_Value_2)     Call SetCellText(sh2, j + 1, 3, C_Value_2)     Call SetCellText(sh2, j + 1, 4, D_Value_2)   Next   Set sh2 = Nothing    End Sub Private Function GetCellText(ByRef sh As Worksheet, ByVal rowIndex As Integer, ByVal colIndex As Integer) As String   Dim rng As Range   Set rng = sh.Cells(rowIndex, colIndex)   GetCellText = rng.Text   Set rng = Nothing End Function Private Sub SetCellText(ByRef sh As Worksheet, ByVal rowIndex As Integer, ByVal colIndex As Integer, ByVal value As String)   Dim rng As Range   Set rng = sh.Cells(rowIndex, colIndex)   rng.value = value   Set rng = Nothing End Sub

その他の回答 (1)

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

言っていることは推測が付く。しかしもう少し具体的(らしい)丁寧な例にして、イメージが直感できるよう、例を挙げてほしい。Idやa、b、cなどではなく。 また列の位置がOKWAVEでは崩れて見辛くなるので、その点ご考慮を。 ーー ID列ででソート。 直前(行)のキー(ID)と現在(行)を比較して 変わらなければ、計数列の計数を足しこみ 変われば合計を書き出し、合計を0にする。 総合計が必要なら、総合計に加えて、合計を0にする。 >集計しなくてもいい行はそのまま これが具体的には良くわからない。 >データになにも入力されていないセルは"."が入ります 珍しい例だが、ピリオドが入るのですか。 であればそのセルは0を足す。 ーーー SUBTOTAL関数というのがあるが、検討してみましたか。使えるかもしれない。 ピボットテーブルも使えるかもしれない、検討してみてください。

deaimax
質問者

お礼

vba,関数では無理そうでしょうか? データも多いのでマクロにしたいです。

関連するQ&A

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • セルの文字式の計算をVBAで行いたい

    A1のセルに "100+5n" という文字式が入っている状態で VBAにてこのセルの文字式計算を行いB1のセルから順に結果を出力したいと思っています。 "n"は1から順に指定された数まで1づつ増えていくようにし B1のセル:105、C1のセル:110、D1のセル:115 ・・・・ と結果がなるようにしたいのですが、VBAでどのように記述すればいいのか悩んでいます。 VBAを使わずにExcelの関数で計算できるのならそれでもよいと思っています。

  • VLOOKUP関数をVBAで使用したい

    VLOOKUP関数をVBAで使用したい 「検索」シートにID番号を入力すると、「データ」シートのA列に入っているデータから入力されたID番号を検索し、該当するID番号のある行の横並びに入っている別の列データ(B~AG列)を取り出し、それぞれを「検索」シートの様々なセルに表示するVBAを作っていますが、VBAでVLOOKUP関数を用いる方法がよく分からず苦戦しています。 「データ」シートの1、2行目は見出しで、検索されるデータが入っているのは3行目からです。また、「データ」シートには不定期に新しいデータが追加されていきます。 「検索」シートに検索結果を表示する際も、以下のように規則性のないセル配置なので少しややこしいです。 「検索」シートのセル=「データ」シートの列 B6=B列  B8=C列  B10=D列  B11=E列  B12=F列 B13=G列  B14=H列  B16=I列  D16=J列  F16=K列 B17=L列  D17=M列  F17=N列  B20=O列  C20=P列 E20=Q列  B21=R列  C21=S列  E21=T列  B22=U列 C22=V列  E22=W列  B23=X列  C23=Y列  E23=Z列 B24=AA列  C24=AB列  E24=AC列  B26=AD列 E26=AE列  B29=AF列  B31=AG列 このような動作をVBAでさせることは可能でしょうか? また、検索して該当するID番号がなかった際も、VBAだとそこで動作が止まってしまうので、「該当するID番号がありません」といったエラー判定が出るようにすることはできますか? 教えてください。よろしくお願いします。

  • EXCEL VBAについて

    VBAでCSVファイルをテンプレートのBBOKに読込むコードを 作り、CSVファイルから読込んだBOOK1データを集計する BOOK2を作成しています。 BOOK1・11/21・・・11/21・・・11/22・・・11/23と続きます      A     B     C      D 1  ID     店名   売上    日付 2 1104567   渋谷店  190,809   11/21 3 1102031   新宿店  209,808   11/21 4 1103450   横浜店  108,765   11/21 BOOK2・集計      A    B    C       D       E 1  ID   店名   11/21    11/22     11/23 2 1104567  渋谷店  190,809   203,487 3 1102031  新宿店  209,808   340,876 4 1103450  横浜店  108,765   547,627 ※BOOK1とBOOK2のIDの並び順は一致していません。 上記のBOOK1のデータをBOOK2に読込ませたいと考えています。 VLOOKUPやINDEX関数を使用しようかと考えたのですが、日付毎に ファイル名が違うのと、集計のファイルには外部参照をさせたくないと 考えています。 VBAで作成したいコードはBOOK1からBOOK2の日付のセルにIDを検索条件として日付毎のファイルを読込ませたいです。 フォームで日付を入力し、コピーするBOOK2のセルを指定後、BOOK1を選択するためにダイアログボックスを出したいです。 BOOK2のIDを検索条件としてBOOK1から一致する売上セルを抽出するコードだけでもわかれば何とか作成できそうなのですが、 ご教授いただけませんでしょうか?

  • エクセルVBAで別ブックを参照してDSUM

    エクセルVBAで別ブック(閉じてる)を参照してDSUMをしたいです。 インターネットや本等で調べたのですが、全然分かりませんでした。 何卒、よろしくお願い申し上げます。 【前提】 ・エクセルファイルが2つあります。 1つ目は「DB」ファイル(Cドライブ直下)。 2つ目は「表示」ファイル(デスクトップ上。「DB」ファイルとは別の場所)。 ・「DB」ファイルの仕様は、Sheet1に以下のとおりです。 A列:会社(1行目には、会社と記載して2行目以降に値) B列:部署(1行目には、部署と記載して2行目以降に値) C列:氏名(1行目には、指名と記載して2行目以降に値) D列:金額(1行目には、金額と記載して2行目以降に値) ※値(データ)の行数は、数万行となる見込みです。 【実現したいこと】 ・「DB」ファイルのSheet1のデータを、DSUM関数の”データベース”として、 金額を集計して、「表示」ファイルで集計・表示させたい。 ・なお、DSUM関数の"条件"としては、会社と部署と氏名の3つとしたい。 ※具体的には、「読み出し」ファイルのSheet1のセルA2に会社を、セルB2に部署を、 セルC2に氏名を入力できるようにる。 それらすべてをAND条件として、金額を集計させたい(金額の集計は、セルD2に出力)です。 以上の内容で考えています。 ひとつのエクセルファイルで作成してみたのですが、データが数万行もあるため、容量が非常に大きくなってしまいます。 集計結果(集計条件を変更させて確認できる状態)は、複数メンバーで共有したいと思っています。 エクセルのVBAで上記のことを実現できないでしょうか。 Accessは、自分含め他のメンバーも知識が乏しいため、避けたいと思っています。 よろしくお願い申し上げます。

  • VBAで任意の文字列の数のカウント方法を教えてください。

    VBAで任意の文字列の数のカウント方法を教えてください。 A a:b c:d a:b:d c:d a a:b:c:d ・ ・ ・ というデータがあります。 ひとつのセルにa~dまでの項目がランダムに入っており、項目は:で区切られています。 1つのセルに項目が重複することはありませんが、入っている項目数はバラバラです。 空白もあり得ます。 データの数(行数)は都度、変わります。 この時のa~dの項目のそれぞれの集計を取りたいのですが、VBAで作成する方法を教えてください。 トータルで、aが4個、bが3個、cが3個、という集計を一度に出したいのです。 よろしくお願いします。

  • エクセルVBA及び関数

    初心者です。お教えお願いします エクセル2003です 空白行及び0をなくしたいのですが(C列を入力された時点で自動でE列のようにしたい) 関数の場合及びVBAのシートコードを両方教えていただけないでしょうか VBAのコードは勉強の為です Sheet1    A    B     C     D     E     F 16          文字A        文字A 17          文字B        文字B 18            0         文字C 19          文字C        文字D 20            0         文字E 21          文字D        文字F      22      23          文字E 24 25          文字F 文字はC16~C80まで入っております B16~E80までのセルのみで行いたいのですが 他の場所は関数やグラフ等がすでに入ってますのでいじりたくありません E16~をフォームのコンボボックスのリストにしようと思ってます よろしくお願いましす

  • VBAで色の付いているセルの行削除

    VBAで色の付いているセルの行を削除することは出来ないでしょうか? 量が多すぎて一つ一つ削除すのは大変で間違えて削除してしまいそうなので・・・ - 文字または数字 ■ 色の付いたセル(赤)  A B C D E F・・・ 1- - - - - - 2- - - - - - 3- - - ■ - - 4- - ■ - - - 5- - ■ - - - 6- - - - - - 7- - - ■ - - 8- - ■ - - - 9- - ■ - - - 10- - - - - -       ↓  A B C D E F・・・ 1- - - - - - 2- - - - - - 6- - - - - - 10- - - - - - よろしくお願いします。

  • エクセルVBAで関数が入った空白セルの取得

    エクセルVBAで下記のようなセルの参照をしたいのですが、よろしくお願いします。(エクセル2002です)   A  B  C  D  E  F 1 78 80 セル(A1)(B1)には値も関数も入れられています。 セル(C1)(D1)(E1)には値は入っていませんが、ワークシート関数が組み込まれており空白となっています。(関数の""にて空白) セル(F1)には何も入力されていません。 今回はセル(B1)の80の値を取得できるようにVBAで下記のようにコードを組みました。 Range("F1").End(elToLeft).Activate そうすると、セル(E1)に関数があるために(?)(E1)がアクティブな状態となります。 関数が入力されていても空白として(B1)をアクティブな状態にするために良い方法はありますでしょうか? 誠に申し訳ございませんが、よろしくお願いします。

  • VBA 最終行の日付を求める

    VBA初心者です。 最終行の日付を求める方法を教えて下さい。 以下のような場合、2009年3月1日 そしてその結果を別のセル(例えばD1セルとか)に出力する方法もお願いします。 ---------  A列  B列 C列  2009  1  1 2009  2  1 2009  3  1

専門家に質問してみよう