• ベストアンサー

ピボットテーブルでクリックしたセルのラベルの取得

図のようなピボットを作成しました。 C8セル(=合計/金額90円)をクリックしたときに、VBAで行ラベル、列ラベルを取得することはできますか? イメージ str売上月 = 関数(8, 3,”売上月”) 'C8セルの行(=8)、列(=3)と行ラベル”売上月”を引数で渡すと、"2017年1月"を取得してstr売上月に格納される str売上日 = 関数(8, 3,”売上日”) ’←"3日"を取得する str商品グループ = 関数(8, 3,”商品グループ”) ’←”あ”を取得する str商品 = 関数(8, 3,”商品”) ’←”B”を取得する よろしくお願いします。

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

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

ども。目が覚めてまだ回答がないので、ザックリとですが、、、。 「C8セルをクリックしたとき」 「= 関数(8, 3,”売上月”)」 同じ設問とは思えないので、 イベントの話、関数の話、分けてお応えします。 > C8セル(=合計/金額90円)をクリックしたときに、 > VBAで行ラベル、列ラベルを取得することはできますか? Excelは表計算アプリケーションですので、 セル選択やカーソル移動はあっても、 「セルをクリック」という概念がなく、 そのタイミングを捉えることは (※よく誤った解説を見掛けますけれども) 出来ません。 本来は機能を呼び出したりモードを切り替える為の 「セルをダブルクリック」 で本来の機能を休止するような形でも宜しければ、 _BeforeDoubleClick イベントを試してみて下さい。 ピボットテーブルのあるシートのシートモジュールに以下。 (シートタブでシート名を右クリック→[コードの表示]→シートモジュール) 状況が判らないので、当該シートにピボットテーブルは ひとつ という条件です。 ' ' // シートモジュール専用 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim oPvT As PivotTable Dim str売上月 As String, str売上日 As String Dim str商品グループ As String, str商品 As String   Set oPvT = Me.PivotTables(1)   If Intersect(Target, oPvT.DataBodyRange) Is Nothing Then Exit Sub   Cancel = True   On Error Resume Next   With Target.PivotCell     str売上月 = .RowItems(1)     str売上日 = .RowItems(2)     str商品グループ = .ColumnItems(1)     str商品 = .ColumnItems(2)   End With   On Error GoTo 0 ' 以下↓は確認のための仮のもの   MsgBox vbTab & "行 : " & Target.Row & vbTab & "列 : " & Target.Column _     & vbLf & "売上月 : " & str売上月 _     & vbLf & "売上日 : " & str売上日 _     & vbLf & "売上日 : " & str商品グループ _     & vbLf & "売上日 : " & str商品 _     & vbLf & "金額 : " & Target.Value End Sub ' ' // セル[9,3]では、売上日が無くてエラーになるとか、 エラーについては、 On Error Resume Next で逃げています。 ダブルクリックする場所([総計]等)によっては、 本来のピボットテーブルの機能をキャンセルすることになるので、 デザイン上の追加処理をする時は、 Excelを[デザインモード]に切り替えて、 上記 Worksheet_BeforeDoubleClick を無効にしてから 編集するようにしてください。 次に、 > イメージ > str売上月 = 関数(8, 3,”売上月”) 'C8セルの行(=8)、列(=3)と行ラベル”売上月”を引数で渡すと、"2017年1月"を取得してstr売上月に格納される > str売上日 = 関数(8, 3,”売上日”) ’←"3日"を取得する > str商品グループ = 関数(8, 3,”商品グループ”) ’←”あ”を取得する > str商品 = 関数(8, 3,”商品”) ’←”B”を取得する 関数?は、こんな感じ。(VBA専用。ワークシート使用は不可です。) ピボットテーブルのあるシートを正確なシート名で指定してください。 ' ' // Function 関数(r As Long, c As Long, f As String) As Variant   On Error GoTo ErrRef_   With Worksheets("Sheet1").Cells(r, c).PivotCell ' シート名■要指定 必須!!     Select Case f     Case "売上月": 関数 = .RowItems(1)     Case "売上日": 関数 = .RowItems(2)     Case "商品グループ": 関数 = .ColumnItems(1)     Case "商品": 関数 = .ColumnItems(2)     Case Else:: 関数 = "#REF!"     End Select   End With   On Error GoTo 0   Exit Function ErrRef_:   関数 = "#REF!"   Exit Function End Function ' ' // 関数名は[すべて置換]機能でお好きなものに替えて下さい。 基本構文は、  Range("C8").PivotCell.RowItems(2) → [売上日] のようになります。 以上ですが、次回の回答機会が未定になりますのでご了承を。

fxgame1224
質問者

お礼

ありがとうございました。 解決しました。 ちなみに「セルをクリックした」タイミングは Worksheet_SelectionChangeイベントを使ってます。 不勉強のため、なぜクリックしただけで変更とみなされるのかわかってませんが とりあえず期待通りの動作をしているので使い続けてます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

No.1 お礼コメントへの返信です。 > Worksheet_SelectionChangeイベントを使ってます > とりあえず期待通りの動作をしているので使い続けてます。 それならそれでいい、と思いますが、一応説明しておきますね。 Excelでの一般的な用語として、"クリック"というと、 ボタン等のコントロールや描画オブジェクトに対して、  マウスカーソルを当てて左クリックするとか、  フォーカスを当ててEnterキーを押すとか、 結果として押した回数だけ関連付けした機能を呼び出すもの という風に説明できると思います。 対して、 Excelの"Worksheet_SelectionChangeイベント"は、 文字通り「選択セル範囲 が 変更された」タイミング を捉えて、ユーザーが求める処理を追加する為のものです。 例えば、[A1]を選択中のシートで、 [B2]範囲を選択すれば、「選択セル範囲 が 変更された」 というタイミングで、"Worksheet_SelectionChangeイベント" が呼び出されます。 続けて、もう一度[B2]範囲を"クリック"したとしても、 選択セル範囲は変更されませんので、 "クリック"したタイミングを捉えることは出来ません。 以上は、"クリック"に比べてSelectionChangeは 不足がある、というお話。 例えば、[A1]を選択中のシートで、 [A1]セルに値を書き込んで確定する為に  Enterキーを押すと、   デフォルトのExcelでは、[A2]セルに  TABキーを押すと、   デフォルトのExcelでは、[B1]セルに それぞれ、カーソル≒選択セル範囲、は遷移します。 この場合も、"クリック"していないのに "Worksheet_SelectionChangeイベント" が呼び出されます。 Enter、TAB、HOME、END、方向キー等のキーボード操作や、 ピボットテーブルでの、フィルター操作や折りたたみで 選択中の範囲が非表示になる時や、 この他にも、普段は意識していないタイミングで、 "クリック"していないのに "Worksheet_SelectionChangeイベント"が呼び出される ことは多数あります。 杓子定規に「選択セル範囲 が 変更された」かどうか、です。 以上は、"クリック"に比べてSelectionChangeは 余分がある、というお話。 【選択中のセル範囲外 の 単一セルを選択した時】 というタイミング それ以外では、範囲選択を全くしない(させない) という状況が作れるのであれば、 _SelectionChangeは "クリック"イベント のような 振る舞いをします。 昔は"セルをクリック"という不適当な言い回しを 結構見掛けたりしましたが、最近は言わないんじゃないかな? "セルを選択する"というのが今では普通の用語ですね。 ということで、 特性を理解した上で、間違いがないように扱うのであれば、 _SelectionChangeを使うのもいいと思いますけれど、 "クリック"だと思っていると、  必要な時に反応してくれなかったり、  思わぬきっかけで処理が実行されたり、 ということにもなりかねませんので、 "Worksheet_SelectionChangeイベント"を "セルをクリックしたタイミング"として説明することは、 ハッキリ間違いとして指摘しておいた方がいいだろうな、 と思ってNo.1でも触れておきましたが、 勿論、必要以上に難しく考えることもないですね。  > Excel VBA リファレンス> オブジェクト モデル> Worksheet オブジェクト  > Worksheet.SelectionChange イベント (Excel)  https://msdn.microsoft.com/ja-jp/library/office/ff194470.aspx

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ピボットテーブルで何番目のデータかを取得する

    添付図のようなピボットテーブルを作りました。 行系列1が売上月、行系列2が売上日 列系列1が商品グループ、列系列2が商品コード となってます。 ここでE19セルに入っているデータは行系列1の何番目か、列系列1の何番目かを求めることはできますか? 添付図を例にするとE19に入っているデータは 行系列1(売上月)が2017年4月なので4番目、 列系列1(商品グループ)がKなので2番目、を取得したいです。 ちなみに最終的にやりたいことは このピボットを元データにしたグラフで E19に相当する場所のデータラベルを変更したいのですが、 グラフの中で該当データの場所を指定するのに Chart.SeriesCollection(行番号).Points(列番号)と指定するために、行番号、列番号が求めたいです。 エクセル2010

  • ピボットテーブル 値を縦並びにするには?

    こんばんは。 よろしくお願いします。 シート「売上」の売上表をもとに、ピボットテーブルを新規ワークシートに作成しています。 ●行ラベル:商品名 ●列ラベル:売上日(月ごとにグループ化) ●  値   :売上金額、売上数量 上記の場合、5行目B列以降に「売上額」「売上数量」「売上額」… とフィールド名が列方向(横並び)に配置されているレイアウトになります。 そこで質問です。 この「売上額」と「売上数量」が縦並びに表示されるようにしたいのですが、どうすればいいのでしょうか? 色々試しているのですがうまくいきません。 詳しい方よろしくお願いします。 Vista Excel2007です。

  • Excel 2007 ピボットテーブルの表示について

    元データを使用して、ピボットテーブルを作成します。 <元データ> 商品名 種類 担当者 売上日 備考 本数 りんご 国産 新人 2010/4/1 売れ筋 5 <ピボットテーブル> 売上日 すべて 商品名 種類 担当者 本数 りんご 国産 新人 5 この場合に、レポートフィルタに「売上日」を入れます。 その他は行ラベルに「商品名」、列ラベル「商品名」「種類」「担当者」、値に「本数」を入れます。 ただし、列ラベルが表のように表示できないため困っています。 どのように操作すれば、表示できますでしょうか。 よろしくお願いいたします。

  • エクセル2010 ピボットテーブルについて

    エクセル2010のピボットテーブルで、元データの中に売上月とIDと社名と売上金額の4項目があります。 これらを月別ID別会社別に集計しています。 レポートフィルタ:売上月 行ラベル:ID、社名 値:売上金額 としています。 同じIDのものが毎月売上が上がるのですが、7月から社名が変わったものは1~6月までの社名の行と7月からの新社名の行と2行になります。 これをピボットテーブル内で新社名だけの行を表示したいです。IDは同じなので売上金額は1~7月の合計を表示させたいのですが可能でしょうか・・・ 元データのリストにIDが重複している中の、一番下の行の社名をピボットに表示させるイメージです。 わかりにくいかもしれないですが、助けてください!!

  • ピボットテーブル

    行に顧客名、列に契約月、交差する座標に領収日を入力するような駐車場の売上管理表をエクセルのピボットテーブルで作ろうとすると、領収日が日付でなく個数になってしまいます。何か良い方法は、ありませんか?宜しく願いします。

  • 合計金額に対する割合を出したい ピボットテーブル

    エクセル2007 ピボットテーブル 合計金額に対する割合を出したい A列 商品名 りんご りんご みかん バナナ B列 金額 100 120 150 300 このデータをソースにしてピボットテーブルを作成し、 「行ラベル」に商品名、 「値」に金額をドラッグしました。 その時、総計行に合計金額 670が表示されますが 合計金額に対する割合の列をピボットテーブルで作成することは可能ですか? 例えばF列に 合計の670を100%として F2セルに=E2/$E$5といれてF5までオートフィルをして、 F列の書式をパーセンテージに変えればできますが これと同じことをピボットテーブルで列を作り、行いたいです。

  • ピボットテーブルで日付をグループ化 日付が文字列になる

    こんにちは。エクセル2003です。 ピボットテーブルウィザードを使い、 ピボットテーブルを作成し 行のフィールドに日付をドラッグして グループ化→「月」「日」を選択してOKを押すと 画像のようになります。 この時、日付が「○月○日」という表示形式になり C列でデータタイプを調べたところ、「2」になり、文字列となっています。 元データではなくピボットテーブルで作成した日付の情報を取得してまだ作業することがあるので 元の年月日がわかるようにしたいのですが不可能でしょうか?

  • ピボットテーブルで教えてください

    ピボットテーブルでレイアウトは出来たのですが、書式をkg表示→t表示に変えなければならない列がありました。その場合ダイレクトに計算式を入れることはどうすれば可能ですか? 集計行毎に色を付けるのと、どうも月→四半期のグループ化も上手く出来ず悩んでます。 ピボットはどうやって勉強すればいいのでしょうか?参考書もいまいちで。ちなみにエクセル2003です。 よろしくお願い致します。

  • ピボットテーブル内のフィールド値を求める計算式

    セル位置(行や列)を引数に、別の表にあるセルの値をINDIRECT関数で 参照するような感じと同様に、ピボットテーブル中のフィールド値の種別 を参照する計算式の書き方が分かれば教えてください。 図のように、ピボットテーブル内のフィールド値の中に、 複数の重複した要素がある場合に、 ピボットテーブルの行番号を指定して、その行にある値は INDIRECTで求められますが、フィルターの見出しにあたる (この図の例では「型式」のフィールド区分)を求める 計算式(あるいは計算式の組み合わせ)が分かりませんでした。 ピボットテーブルが固定されていれば、行列番号が変わらない 前提で方法はありそうですが、 ピボットテーブルのフィールドの順番を入れ替えても (この図の例では区分と型式を入れ替えても) 大丈夫なように、汎用的な式が書ければと思っています。 よろしくお願いします。 (1)重複した要素のある元データ表 (2)行フィルターに複数のテーブル条件を指定 (3)できがったピボットテーブル (4)行番後を指定して、INDIRECTで値を求めるのと同様、行フィルターの元のフィールドを計算式で求められるか。

  • ピボットテーブルで列ラベルにすべての月を表示する

    ピボットテーブルで列ラベルに1月から12月までデータのない月も表示したいのです。列ラベルに持ってきた項目は、データベースで入力された日付を以下の関数で隣のセルに26日始まり25日締めに直して表示した月、名づけて”計上月”です。 =IF(A1=0,"",IF(DAY(A1)>=26,YEAR(A1)&"年"&MONTH(A1)+1&"月",YEAR(A1)&"年"&MONTH(A1)&"月"))。 たとえば1月25日は”1月”、1月26日は”2月”と表示されます。 列ラベルのフィールドの設定で、「データのないアイテムを表示する」にチェックをつけても、データのあるアイテムしか表示されません。どうしたらうまくいきますか?

このQ&Aのポイント
  • 同性愛者に対する理解と対応について考えた授業でしたが、否定的な意見が多く、なぜ異性愛者との対応が異なるのか疑問に感じました。
  • 同性愛者に対する否定的な意見や差別的な言動があることに疑問を持ちました。異性愛者と同じように対応すべきではないのかと考えます。
  • 同性愛者に対する嫌悪感や理解の欠如があることに疑問を感じます。異性愛者と同じように尊重すべきですし、個人の自由であるべきです。
回答を見る

専門家に質問してみよう