マクロでデータ増減に対応する方法とは?

このQ&Aのポイント
  • マクロを使用して、データ増減に対応する方法を教えてください。
  • 縦に並んだCSVファイルをピボットテーブルを使用して一覧表に変換したいが、行データーが日によって増減し、総計の列が表示されない場合があります。
  • コードの意味は分かるが、原因と対策が分からず、エラーやデバッグに苦戦しています。
回答を見る
  • ベストアンサー

マクロでデーター増減に対応するには?

 いつもお世話になり有難うございます。少し前からマクロをやり始めているものですが、記録方式ばかりで記述はまだできません。  その記録マクロで殆どは対応できたのですが、何度やっても思う結果が得られないので質問しました。 下記の配列で表が並び 順番  型式  品番  数量   行先  1    A-2   ZX   300       1  1     A-1   WX   150       2  1     B-3   FK   200       2                                                                                       ↓    ↓    ↓   ↓    ↓  これを 順番    1    2 3   品番  A-1 A-2 B-3     総計    ZX    200    WX     150 FK 300 形式の表の型に変えたいと思い、縦に並んでいるCSVファイルをピボットテーブルを用いて一覧表にしょうとしたいのですが、行データーは日により、増減し、最後の総計(合計の列が表示されません。絶対参照と相対参照を切り替えたりしていますが、上手く表示できる場合とできない 時があります。  コードの意味は何となく、分かりますが、原因と対策が分かりません。エラー、デバックばかりで行き詰まっています。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。Wendy02です。 >順番というのはなんですか?元の表では、1,1,1 となっていて、移し変えると、1,2,3 となっているようですが、その論理が分りません。 これについては、きちんとした説明がされていませんので、こちら側で、つけさせていただきました。 '--------------------------------------------- '<標準モジュール> Sub LinesCopyToDestinations() Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim c As Range Dim strItem As String Dim strType As String Dim ItemRow As Variant Dim TypeColumn As Variant Dim i As Long Dim j As Long 'シートの設定 Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") With Sh2  .Range("A1").CurrentRegion.ClearContents  .Range("A1").Value = Sh1.Range("A1").Value '順番  .Range("A2").Value = Sh1.Range("B1").Value '型式 End With Application.ScreenUpdating = False For Each c In Sh1.Range("E2", Sh1.Range("E65536").End(xlUp))   strItem = c.Offset(, -2).Value   strType = c.Offset(, -3).Value  On Error Resume Next   TypeColumn = WorksheetFunction.Match(strType, Sh2.Rows(2), 0)  On Error GoTo 0   If TypeColumn = Empty Then    TypeColumn = Sh2.Range("IV2").End(xlToLeft).Offset(, 1).Column    i = CLng(TypeColumn)    Sh2.Cells(2, i).Value = strType    Else    i = CLng(TypeColumn)   End If   TypeColumn = Empty  On Error Resume Next   ItemRow = WorksheetFunction.Match(strItem, Sh2.Columns(1), 0)  On Error GoTo 0    If ItemRow = Empty Then   j = Sh2.Range("A65536").End(xlUp).Offset(1).Row   Sh2.Cells(j, 1).Value = strItem   Sh2.Cells(j, i).Value = Sh2.Cells(j, i).Value + c.Offset(, -1).Value   j = j + 1  Else   Sh2.Cells(CLng(ItemRow), 1).Value = strItem   Sh2.Cells(CLng(ItemRow), i).Value = Sh2.Cells(CLng(ItemRow), i).Value + c.Offset(, -1).Value   ItemRow = Empty  End If Next   With Sh2.Range("A1").CurrentRegion   .Offset(, 1).Resize(, Columns.Count - 1).Sort _     Key1:=.Cells(2, 2), _     Order1:=xlAscending, _     Header:=xlGuess, _     OrderCustom:=1, _     MatchCase:=False, _     Orientation:=xlLeftToRight   End With   With Sh2   i = .Range("IV2").End(xlToLeft).Offset(, 1).Column   j = .Range("A65536").End(xlUp).Row   .Cells(2, j).Value = "総計"   .Range("B1").Resize(, i - 2).FormulaLocal = "=Column()-1" '順番   .Range("B1").Resize(, i - 1).Value = .Range("B1").Resize(, i - 1).Value   .Range(.Cells(3, i), .Cells(j, i)).FormulaLocal = "=Sum(RC2:RC[-1])"   End With   Application.ScreenUpdating = True   Set Sh1 = Nothing: Set Sh2 = Nothing End Sub

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 #1 さんと同じ内容で恐縮です。 サンプルの列が乱れていてよく分りませんので、こちらが書き直してみました。 半角のスペースは、1個以上はつぶれてしまいますので、よく分らなくなります。 >順番  型式  品番  数量   行先 > 1   A-2  ZX   300    1 > 1   A-1  WX   150    2 > 1   B-3  FK   200    2 ------------------------------------------- >順番  1    2     3 >品番  A-1   A-2   B-3   総計 > ZX       200 > WX           150 > FK  300 同じものが出てきたときは、加算をされるということでしょうか? 行き先とはいうのは、並べ替えられた表には関係があるのですか? 順番というのはなんですか?元の表では、1,1,1 となっていて、移し変えると、1,2,3 となっているようですが、その論理が分りません。

superfighter823
質問者

お礼

 ご返答有難うございます。質問内容の下書き欄が上手く書けず、説明不足になっていました。  列と行が下書きでズレており、  表示したいのは 1.順番を最上段に表示する 2.品番ZX以下を最左の列に並べる(WENDY0  2さんの返答通り) 3.型式と順番は上段の元配列通りで項目が500位ある。増減有 4.行先は捨てる 5.品番ごとの合計を最右列に表示させたい。  なのですが、データー増減幅が大きく、空白セルが(空白)と表示される 6.品番と順番のデーターラベルを入れ替えしているが、品番/順番ごとの合計表示セルが出てしまい、このセルは不要なので表示行を選択し、ジャンプ→空白セル→削除で消したいが、そうすると合計欄が表示されず、消えてしまう。 7.データーの多少に関わらず、不要な(空白セル)を出したくない。 の以上なんです。質問下書きレイアウト編集中にページを切り替えていた時、誤って質問するをクリックしてしまいました。どうもすみません。

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

回答は上げることはできないかもしれませんが、捨石となって、補足要求します。 実例を挙げてくださったのはありがたいが、それだけでは不十分な場合が多く、意図するところを、文章でも説明してください。 下記で良いでしょうか。 (1)順番が同じ製品を、縦横並べ替える。 すると、順番    1    2 3の2、3は何ですか (2)品番は同じ順番のものは、スペース区切りで列挙する。それも並べ替えて。 (3)総計とは何の合計ですか (4)品番と数量に関しては、組にして 縦に1行づつの形式で、下方向に列挙していく。 (5)行き先は捨てるのですか。

superfighter823
質問者

お礼

 ご返答有難うございます。エクセルエキスパートの imogasiさん、いつも明解なお答えをいただき、感謝申し上げます。  ウェンディ02さんのところでも言いましたが、質問内容不完全のまま、クリックしてしまい、申し訳ありませんでした。  私はCSVから作成したピボットテーブルをワークシートを挿入、データー範囲を形式を値にてコピー、ペーストしていますが、合計の項目が順番を上の行、A-1,A-2の番号をその下の行に配置したい、(23の2,3は何かと言うのはA-1は○番目に生産、A-2は○番目に生産と言うことなんです。 順   1     2      3    合計 品番  A1    A2     B2   ○○ ZX  ○ WX               ○    ○○ FK         ○          ○○ としたいのですが、データーラベルを入れ替えてもこのレイアウトにならず、コピー、ペーストしてますが、中々上手く行きません。まだ抽象的だと思われますが、こんな感じです。  imogasiさんは何故そこまでエクセルを理解されているのでしょうか?ウェンディ02さんもそうですが、知識の深さに感心しています。有難うございました。

関連するQ&A

  • エクセルのピボットテーブルで

    ピボットテーブルの表示方法についてです。 表の品名と数量からピボットテーブルを作成します。 行に品名、データ部に数量を表示させるのですが、数量が0(ゼロ)の場合には、その行自体を表示させない様にしたいのです。 元の表の方は変更等出来ないので、ピボットテーブルの方で何とか出来ないかと思います。 【元の表】 品番  数量 A001  5,000 A002    0 B001  4,500 B002    0 上記の2列からピボットテーブルを作成すます。 【ピボットテーブル】 品番  数量 A001  5,000 B001  4,500 総計  9,500 上記の様に、元の表で数量が0なら、その品番と数量の行が表示されない様にです。

  •  EXCELのVBA,マクロでこれはどう記述するのでしょう?

    先日、類似の質問をしたものですが、下記のような表を作成し、A列の型データーを検索して、参照表からVLOOKUP関数で指定列の品番を表示させています。  先日、質問内容が抽象的で分かりにくかったので再度、質問ですが、  関数では出来ないことが前回の質問で分かり、VBAでないとダメだと言うことなんですが、 私のしたいことは、簡単に言いますと、B列の台数セルについて、セルの値を検索して台数が200以上であつた場合、そのセルのある下段に空白行を200なら1行、300なら2行挿入するという風にしたいのです。  これをVBAで実現するにはどのような記述が必要なのでしょうか?簡単に出来るのでしょうか?私はVBAは素人な者で、コード等は良く知りません。  いつもやっているのは、記録マクロばかりで、定形作業で一度組んだマクロの変化する部分(日付、ファイル名)を編集、修正しかしておりません。だからいつもデバック画面と格闘しています。どなたか知っておられたらご指南、お願いします。    A     B      C     D 1  型   台数  品番 2 検索値 250 3 検索値 100 4 検索値 200 5 検索値 150 6 検索値 350

  • エクセルマクロ 異なるファイル名でも実行してくれるマクロ

    マクロ初心者です。よろしくお願いします。 ファイル名はすべて例えです。 「A」エクセルファイルを 「Z」というファイルに貼り付けるマクロを作りました。 そのマクロで「B」ファイルからも「C」ファイルからも 「Z」ファイルにコピーをしなくてはいけないのですが VBAには「A」で記録されているため 「B」と「C」にはそのマクロが使えません・・・。 VBAをどのようにデバックすればいいのでしょうか?

  • エクセルのマクロで特定の文字列を選択したい

    集計表にピボットテーブルを2つ入れるマクロを作成しています。 その際に、出来あがったピボットテーブルの項目ごとの合計を 表示しないためには、対象となるセルを選択して(Select) 表示しないを選択する(Selection.Delete)ことはマクロの記録からわかりました。 しかし、ピボットテーブルの枠が固定されているわけではないので、 合計欄の選択がうまくできません。 結果的には、A列の何行目かに「B在庫」という文字列が表示されていて、 その下からピボットテーブルが作成されています。 その「B在庫」の文字列から「右に3、下に2」と「右に1、下に5」 進んだセルをそれぞれ指定して(Select)削除(Selection.Delete)したいと思っています。 どのように「B在庫」と入力された文字列を探し出すのか、 また、そこから「右に3、下に2」と「右に1、下に5」進んだセルを 指定する方法を教えていただけないでしょうか。

  • マクロを記録するときの、アクティブセルの扱いがよく分かりません

    パソコン教室で使っているテキストの問題を2つ解いているのですが、 A先生とB先生とで解説が異なっており混乱しています。 (1)『表の合計金額の高い順に並べ替えるマクロを作りなさい。   ※アクティブセルを最優先のキーとして並べ替えが行われるようにする事。』 (2)『表の書式をオートフォーマットで編集するマクロを作りなさい。   ※マクロは絶対参照で記録する。   ※アクティブセルで書式が変更されるようにする。』 A先生は、表内の対象(例1では合計金額)をクリックしてからマクロの記録を始めなさいと言います。 B先生は表の外をいったんクリックしておいて、記録を始めてから改めて対象のセルをクリックしなさいと言います。 どっちが模範解答とみなせばよいのでしょうか? VBEでいうRange(~)が必要か否かはっきりしません……よろしくお願いします。

  • ピボットのマクロで

    エクセルでピボットのマクロを自動記録で作ったのですがフィールドのアイテムは全部で30以上あるのですが表示は5個くらいだけなので非表示のステートメントばかりが続きます。 とりあえずはいいと考えていたのですが、今後のためにも表示のアイテムだけを選ぶマクロにするにはどうすればいいのでしょうか

  • ピボットテーブルの連続印刷のマクロを組みたいと思っています。

    会社で複数の他社の年末調整を請け負っているのですが、 データを整理するためにピボットテーブルを使用しています。 コード・氏名 年月 支払額 社会保険 源泉 1a 1901 100000 1000 100 2b 1901 200000 2000 200 3c 1901 300000 3000 300 4d 1901 400000 4000 300 100計       1901 1000000 10000 1000 エクセルにて↑のような書式で、1月~12月(夏季・冬季賞与含)まで作成していき、 ピボットテーブルをボタン一つで作成できるマクロまで組むことが出来たのですが、 完成したピボットテーブルのデータ(1aの1月~12月、2bの1月~12月)を自動で連続印刷できる マクロを作成したいのですが、うまくいきません。 コード・氏名 100計 (←の部分がプルダウン式になっていまして、1a 2b のように選択できます) 年月 支払額    社会保険 源泉 1901 1,500,000 150,000    15,000 1902 1,500,000 150,000    15,000 1903 1,500,000 150,000     15,000 1904 1,500,000 150,000 15,000 1905 1,500,000 150,000    15,000 1906 1,500,000 150,000   15,000 1907 1,500,000 150,000    15,000 1908 1,500,000 150,000 15,000 1909 1,500,000 150,000    15,000 1910 1,500,000 150,000 15,000 1911 1,500,000 150,000    15,000 1912 1,500,000 150,000 15,000 賞与夏 1,500,000 150,000    15,000 賞与冬 1,500,000 150,000    15,000 総計 21,000,000 2,100,000 210,000 ↑ピボットテーブルは、↑のように表示されます。 (レイアウトがガタガタになっていますが、すみません) 会社によって、人数が数人でしたり、数十人だったりしまして、 できれば人数に応じて対応できる印刷用のマクロを教えていただきたいと思っています。 どうぞ、皆さんのお力を貸してください。 宜しくお願いいたします。

  • マクロの相対参照、絶対参照

    マクロを使い始めたばかりなんですけど 相対参照と絶対参照で困ってます 任意のセル(A1とする)を選択しておいてマクロの開始 B1のセルをコピー 最初のセル(A1)に貼り付け としたいんですけど B1のセルをコピー、を絶対参照にして 最初のセル(A1)に貼り付け、を相対参照にしてマクロに記録しました そのマクロをC1で使うと A1のセルにB1のセルを貼り付けてしまいます C1でマクロを使えばB1のセルをC1に貼り付けるようにはどうすればいいのでしょう 分かりにくい説明で申し訳ありません

  • エクセルのマクロ

    教えてください。   A     B   C 1 部品番号  ○   済印 2 111111   ○   済 3 222222   ○   済 4 333333   ○ という表があるとします。 B列にマクロのボタンを作っておき、 A列に部品番号を入力したら、マクロのボタンを押して、 C列に済、という字を表示したいのです。 1部品入力するごとに、その表示をさせたいです。 2行目、3行目・・・と一つずつマクロを登録して いく方法は、(マクロについては詳しくないので、マクロの記録、マクロの停止、という方法しかわかりません)入力するデータが100件以上あるため、それもどうかな・・と悩んでいます。超初心者なのですが、何とか完成したいと思っています。 よろしくお願い致します。

  • ピボットテーブルのマクロについて

    ピボットテーブルのマクロについて教えてください。 NO 場所  ランク 面積 1  東京  上    10 2  大阪  上    20 3  福岡  中    20 4  広島  中    30 5  東京  中    15 6  東京  中   25 7  大阪  下   35 8  福岡  下   45 9  大阪  下   10 10 大阪  下   10 という表があり、 場所ごとランクごとの面積集計を ピボットテーブルのマクロを組んで実施したい のですが(同じ作業を繰り返すので)、 マクロを記録して、内容を実行しようとすると、 「実行時エラー」が出てしまいます。 記録したマクロは以下の通りです。 ( → ←のところでエラーが出ます) Sub Macro1()  ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _   "Sheet1!C2:C4").CreatePivotTable TableDestination:="", TableName:= _  "ピボットテーブル2", DefaultVersion:=xlPivotTableVersion10  ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)  ActiveSheet.Cells(3, 1).Select → With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("場所")   ←   .Orientation = xlRowField   .Position = 1  End With With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("ランク")    .Orientation = xlRowField    .Position = 2  End With  ActiveSheet.PivotTables("ピボットテーブル2").AddDataField ActiveSheet.PivotTables( _    "ピボットテーブル2").PivotFields("面積"), "データの個数 / 面積", xlCount  Range("A3").Select  ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("データの個数 / 面積 ").Function = _  xlSum End Sub ピボットテーブルのフィールドリストがうまく挙がってこないようなのですが、 どのようにマクロを組み直せば、よいのでしょうか? 作りたい集計表は、以下のようなものです。 場所 ランク  合計 広島  中   30  集計     30 大阪  下   55     上    20  集計     75 東京  上   10     中    40  集計     50 福岡  下   45     中    20  集計     65 総計      220 長々とまた見づらくてすみません。 よろしくお願いします。

専門家に質問してみよう