こんにちは。よろしくお願いします。
ピボットデーブルをマクロで作成したいのですが、条件がいくつかあり、それに沿ったものをどうすれば作成できるか教えていただきたいと思います。マクロは記録するものを使用する程度の初心者です。

<元データ>
A B C D E
1 生徒 科目 期末1 期末2 期末3・・・
2 花子 国語  20   30  50 ・・・
3 花子 英語  40   10  60 ・・・
4 花子 化学  10   20  50 ・・・
5 太郎 国語  10   20  50 ・・・
6 太郎 英語  40   30  50 ・・・
7 太郎 化学  50   70  80 ・・・
↓ ↓
<作成したいピボットテーブル>
     期末1    期末2   期末3・・・
    国語 英語 国語 英語 国語 英語・・・
 花子 20  40  30   10  50  60 ・・・
 太郎 10  40  20   30  50  50 ・・・

(1)既存の「結果」という名前のシートにピボットを作成したいです。
(2)期末1、期末2・・・のC列からのデータの列数は毎回違います。
(3)今回は国語、英語、化学のデータから国語と英語のデータを例にとりましたが、科目の種類も科目の数も毎回違います。生徒数も変わります。
別シート(シート名「結果」)のA列に、まとめる際に必要な科目名が入力されており、そことリンクさせてピボットを作成できたら、と思っています。(例 A1に国語 A2に英語と入力されていたら、上記の作成したいピボットテーブルのような形になる、というように)

どなたかお力を貸していただけますでしょうか。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

徒然なるままに作成してみました。

シート名などご希望とは異なりますが、もし使ってみようという気になられたら、怪しげな英語で変数名をつけてありますので、参考にしていただき、ご自分で修正してください。
元データの変化への動的な対応がお望みなので、その分だけ分かりにくくなっているとは思います。
XL2000のコードですので、他の環境での動作は不明です。他の環境への対応、解説、メンテナンスはできません。
Sub test()
Dim columnIndex() As String
Dim targetRange As Range, destRange As Range, pivotRange As Range
Dim myRow As Range
Dim dataSheet As Worksheet, criteriaSheet As Worksheet
Dim tempSheet As Worksheet, pivotSheet As Worksheet
Dim i As Long, j As Long

With ThisWorkbook
'元データのシート、フィルタオプションの抽出条件のシート
Set dataSheet = .Sheets("Sheet1"): Set criteriaSheet = .Sheets("Sheet2")
'ピボット用に整形したデータのシート、ピボット出力用のシート
Set tempSheet = .Sheets("Sheet3"): Set pivotSheet = .Sheets("Sheet4")
End With
'フィルタオプションで、目的の科目のデータ以外を隠す
'抽出条件シートに A1 科目、A2 国語、A3 英語という様にいれておく。
Set targetRange = dataSheet.Range("a1").CurrentRegion
If dataSheet.FilterMode = True Then dataSheet.ShowAllData
targetRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
criteriaSheet.Range("A1").CurrentRegion, Unique:=False
'データベースのレコード形式のデータに整形
tempSheet.Cells.Clear
Set destRange = tempSheet.Range("a1")
ReDim columnIndex(1 To targetRange.Columns.Count - 2)
For i = 1 To targetRange.Columns.Count - 2
columnIndex(i) = targetRange.Cells(1).Offset(0, i + 1).Value
Next i
For j = 1 To targetRange.Rows.Count
Set myRow = targetRange.Rows(j)
If j = 1 Then
With destRange
.Value = myRow.Cells(1)
.Offset(0, 1).Value = myRow.Cells(2)
.Offset(0, 2).Value = "試験"
.Offset(0, 3).Value = "点数"
End With
Set destRange = destRange.Offset(1, 0)
Else
'隠されたデータは整形出力しない
If myRow.EntireRow.Hidden = False Then
For i = 1 To UBound(columnIndex)
With destRange
.Value = myRow.Cells(1)
.Offset(0, 1).Value = myRow.Cells(2)
.Offset(0, 2).Value = columnIndex(i)
.Offset(0, 3).Value = myRow.Cells(2 + i)
End With
Set destRange = destRange.Offset(1, 0)
Next i
End If
End If
Next j
Set pivotRange = tempSheet.Range("a1").CurrentRegion
Call makepivot(pivotRange, pivotSheet)
End Sub

Sub makepivot(dataRange As Range, destSheet As Worksheet)
Dim dataRangeAddress As String
Dim pivotTableName As String

pivotTableName = "ピボットテーブル1"
dataRangeAddress = dataRange.Parent.Name & "!" & dataRange.Address(ReferenceStyle:=xlR1C1)
destSheet.Activate
destSheet.Cells.Clear
destSheet.Parent.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
dataRangeAddress).CreatePivotTable TableDestination:=Range("A3"), _
TableName:=pivotTableName
With destSheet.PivotTables(pivotTableName)
.SmallGrid = False
.PivotFields("生徒").Orientation = xlRowField
.PivotFields("試験").Orientation = xlColumnField
.PivotFields("科目").Orientation = xlColumnField
.PivotFields("点数").Orientation = xlDataField
.ColumnGrand = False
.RowGrand = False
.PivotFields("試験").Subtotals = Array( _
False, False, False, False, False, False, False, False, False, False, False, False)
End With
End Sub
参考URL
http://pvttbl.blog23.fc2.com/
    • good
    • 0
この回答へのお礼

早速の丁寧なご回答どうもありがとうございました。
一つ一つ内容を確認しながら、勉強させていただきました。
手元にある参考書で意味を確かめながらなのでかなり理解に時間はかかりましたが、コメントを加えてくださっていたので内容把握の手助けになりました。
作っていただいたものはまさにこう出来たら、と思う理想通りのものです。
実務用にほんの少し手を加えるだけで大幅に効率化が図れそうです。
本当にどうもありがとうございました。
心より感謝いたします。

お礼日時:2009/05/16 18:05

マクロだ何だと言う前に もうちょっと Excelを勉強された方が良いのではないでしょうか?



ピボットで行がいくつ増えてもいいように範囲選択しておけば「更新」をクリックするだけで
増えた分も集計されるのは ご存知でしょうか?

また ピボットの各項目に▽が付いていて「科目」から「国語」と「英語」だけ抽出する方法があるという事をご存知でしょうか?
「科目」が何百もあるなら面倒なのも分かりますが解決方法をマクロに求めるのは ちょっと違うと思いますよ?

僕ならシートを3枚使い「データテーブル用」「ピボット用」「集計用」とします。
(実際に今の業務では そのようにしています)
それでも不都合が出て来たら科目毎にブックを分けるとか、方法はあると思いますが
今回のケースでは「マクロ」は違うと思います。

「ピボット」の意味をご存知ですか?
バスケの「ピボット」と同じ意味ですよ。
「何かを軸に色々な方向へ」というニュアンスです。
    • good
    • 0
この回答へのお礼

ご教授、ご回答ありがとうございます。
確かに勉強不足で理解していない事も多く、ご指摘の通りです。
職場の年配のパソコンに苦手意識のある方にも、ボタンひとつでデータの処理ができるものが何とかできないかと思い、このように質問させていただきました。
ピボットテーブルの使い方も参考にさせていただきます。
どうもありがとうございました。

お礼日時:2009/05/16 18:08

>ピボットデーブルをマクロで作成したいのですが



質問の意図がよくわからないのですが・・・。
「ピボットテーブルはリスト形式になったものを集計する」という機能です。
質問の元データはすでにテーブルデータですので、ピボットテーブルで作成したいものを作るのは、困難ではないのでしょうか。
他にも方法はあると思いますが、
ピボットテーブルを使うなら元データをリスト形式にする。
マクロを使うなら「ピボットテーブルをマクロで」とこだわらない。
など考え方を変えてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

わかりにくい質問で申し訳ありません。
多いとは言えない知識の中で考えたもので、これ以外に選択が思い浮かびませんでした。これからさらに勉強していきたいと思います。
ありがとうございました。

お礼日時:2009/05/16 18:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA(マクロ)を勉強したい

VBAを勉強したいのですが、オススメの本等教えて下さい。
今FOM出版のマクロ入門を買って勉強しています。大体の基本操作は分かった気がします。

Aベストアンサー

こんにちは。

ここら辺が参考になると思います。

日本VBA協会の参考書籍
の準拠本
http://www.vbaa.jp/training/books.htm

アマゾンのExcelVBA
http://www.amazon.co.jp/exec/obidos/ASIN/4774119660/vbaajpn-22/249-7235447-7367506

Q関数で年齢が10~19歳を10代列に1を20~29歳なら20代に1を立てたい

いつもお世話になっております。
お分かりになる方にもう一度お力をお借りしたいと思います。

シートが2つあり、AシートA2に名前を入力したら、Bシートからデータが入るようにVlookでひっぱってくるように関数をいれてあります。
Bシートには氏名、年齢、性別。。。とあり、年齢がそれぞれ記入されてあります。
10歳~19歳ならAシートの10代の列に1を立て、20~29歳なら20代に1を立てたいのです。
Bシート
氏名 年齢 性別
山田 19  男性
田中 35  女性
中田 59  男性
田口 32  男性
     
Aシート
最終↓のようなデータを作成したいのです。
氏名、10代 20代 30代 40代 50代 60代 男性 女性
山田  1
田中        1
中田              1
田口        1
合計  1     2      1

どうもこうもうまくいきません。Bシートに列を追加することは可能です。
山田を入力すると10代に1のフラグが立てればどんな関数でもOKです。
もし、おわかりになる方がおられましたら、是非ご教授いただきたいと思います。
手打ちした方が早いかなとも思うのですが、データが多いのでなんとか効率化と考えております。
宜しくお願い致します。

いつもお世話になっております。
お分かりになる方にもう一度お力をお借りしたいと思います。

シートが2つあり、AシートA2に名前を入力したら、Bシートからデータが入るようにVlookでひっぱってくるように関数をいれてあります。
Bシートには氏名、年齢、性別。。。とあり、年齢がそれぞれ記入されてあります。
10歳~19歳ならAシートの10代の列に1を立て、20~29歳なら20代に1を立てたいのです。
Bシート
氏名 年齢 性別
山田 19  男性
田中 35  女性
中田 59  男性
田口 32  男性
 ...続きを読む

Aベストアンサー

こんばんは!

https://oshiete.goo.ne.jp/qa/9123415.html
の関連質問ですかね?

↓の画像で、「A」SheetのB2セルに
=IF(INT(VLOOKUP($A2,B!$A:$B,2,0)/10)=COLUMN(A1),1,"")
という数式を入れ、列・行方向にフィル&コピーしています。

※ 男性・女性の列は割愛しました。m(_ _)m

QマクロとVBAの違いは?

最近officeのVBAを勉強してるのですが「マクロ」と「VBA」って何が違うのでしょうか?

アクセスはマクロとVBA(VBE)が別れてるけど、
エクセルは「マクロの記録」でVBAコードが取得できますよね。

マクロとVBAは同じ意味なのか、違う意味なのか教えていただけますか?

Aベストアンサー

こんにちは。

#2さんの引用先と同じ内容ですが、日本語として出ていたはずです。

マクロとVBAを、一応、定義として把握していないと、きちんと人には教えられないと思いますね。アクセスには、一般的に、VBA側で作られたものは、マクロとは呼べません。

理由は、「マクロ」というのは、その取り扱い言語は別として、ひとつの作業(タスク)の自動実行を目的とする機能のことです。逆にいうと、ひとつの作業を実行できないものは、マクロとは呼びません。例えば、引数を必要とするユーザー定義関数は、マクロの範疇から外れます。

マイクロソフトでは、こう定義しています。

以下は、内容的に、あくまでも、VBAの範疇に対して書かれています。

マクロは、より意味の限定された用語で、引数を持たないパブリックなSub プロシージャのことだけを指します。すべてのマクロはプロシージャですが、すべてのプロシージャがマクロであるとは限りません。マクロの記録機能を使って生成されるプロシージャとOffice アプリケーションの[マクロ]ダイアログボックスから実行できるプロシージャは、すべてマクロです。

それに反して、VBAというのは、アプリケーション用のVisual Basic プログラミング言語です。

「VBA」で書かれたものを総称して、プロシージャと呼び、マクロとは厳密には意味が異なります。また、Ver.4 の「マクロ関数」で書かれたものも、プロシージャで自動実行で作業をするものも、総称してマクロと呼びます。また、ひとつのブックにあるモジュール(=プロシージャを呼び出すためのオブジェクト)群をプロジェクトと呼び、「モジュール」を組み合わせ一貫した仕事をするようにしたものを「システム」と呼んだりします。

これで、違いが分かっていただけたかと思います。

こんにちは。

#2さんの引用先と同じ内容ですが、日本語として出ていたはずです。

マクロとVBAを、一応、定義として把握していないと、きちんと人には教えられないと思いますね。アクセスには、一般的に、VBA側で作られたものは、マクロとは呼べません。

理由は、「マクロ」というのは、その取り扱い言語は別として、ひとつの作業(タスク)の自動実行を目的とする機能のことです。逆にいうと、ひとつの作業を実行できないものは、マクロとは呼びません。例えば、引数を必要とするユーザー定義関数は、マクロの...続きを読む

Qピボットテーブルを作成後、シートを削除するマクロ

いつもお世話になっております。
ピボットテーブルを作成するマクロを作ったのですが、このシートを削除するマクロが分からなく困っています。

ピボットテーブルは毎回作成しては削除するので、シートの名前が2,3,4と、どんどん大きくなっていって、シート名が固定化できないんです。

シート名に関わらず、ピボットテーブルを削除するマクロをご教示願います。

Aベストアンサー

ピボットテーブルを 新規のシートに作成せず 特定のシート状に表示
させれば良いのでは?

そのシートは シート非表示か 「xlSheetVeryHidden」に設定してお
くかしておけば 特に問題ないように思いますが。

QVBAとマクロ

お世話になります。田吾作7です。

ふと思ったのですが。。。

VBAとマクロの違いって何でしょう?
「マクロの記録」ボタンを押したのがマクロですか?
VBAは、MS-Officeのモジュールにユーザ自身が書き込んだら、それはVBAですか?
もしそうなら、[マクロの記録]ボタンはなぜ[VisualBasicツールバー]にボタンがあるのでしょうか。マクロを編集しやすくするためでしょうか?

記録で
Range("A1").select
それを編集で
Range("A2").select
としたらVBA?

さらに最初っから
Range("A2").select
と記録したマクロは、やっぱりマクロ?


VBAとマクロって違いあるのでしょうか?
いつも疑問に感じて、モヤモヤしてます。
だれか、このモヤモヤ感を解消してください。

よろしくお願いします。


余談ですが・・・
VBAは[VB for Application]ですよね?
Office関連のためのVBってことですよね。
でもAPIを使ってWINDOWSを制御することもできるから[for App]の意味が無いような気がする今日この頃・・・

お世話になります。田吾作7です。

ふと思ったのですが。。。

VBAとマクロの違いって何でしょう?
「マクロの記録」ボタンを押したのがマクロですか?
VBAは、MS-Officeのモジュールにユーザ自身が書き込んだら、それはVBAですか?
もしそうなら、[マクロの記録]ボタンはなぜ[VisualBasicツールバー]にボタンがあるのでしょうか。マクロを編集しやすくするためでしょうか?

記録で
Range("A1").select
それを編集で
Range("A2").select
としたらVBA?

さらに最初っから
...続きを読む

Aベストアンサー

マクロという言語があるわけではないので
決まった処理を登録しておいて後で実行できる機能を
マクロと呼んでいるんじゃないですか?

そのマクロの情報をスクリプトとして保存しておきますので
そのスクリプトがVBAという事だと思いますが。

Q作成済みの表に列を追加するには?(Word2000使用)

8行の表があります。
最初の3行は5列になります。あとの5行は7列になります。

あとの5行の方に項目を増やす部分ができて2列ほど増やさなくてはなりません。
3列目と4列目の間と、6列目と7列目の間です。

最初の3行のレイアウトを変えずに、後の5行に列を追加する簡単な方法があれば
教えてください。何せこれが30ほどあるので、難しい方法だとかなり時間がかかりそうなので・・・。よろしくお願いします。

Aベストアンサー

> あとの5行の方に項目を増やす部分ができて2列ほど増やさなくてはなりません。
> 3列目と4列目の間と、6列目と7列目の間です。

「3列目と4列目の間」の方について。

4行目~8行目の3列目、5つのセルを選択します。メニューの「罫線」→「セルの分割」で
「分割する前にセルを結合する」のチェックを外して、列数を2にして「OK」。

同様に6列目のセルを2列に分割します。

これで、数だけはご希望通りになりました。でも、列の幅が偏っているのが気に入らないでしょうか?
では、4行目~8行目のセルを全部同じ幅にしてみましょう。

4行目~8行目の全てのセルを選択して、メニューの「罫線」→「列の幅をそろえる」です。


いかが?

QVBAとマクロの違い

こんばんは。エクセル初心者です。
VBAとマクロの違いについて教えてください。
VBAというのは、プログラミング言語のことで
よろしいのでしょうか?
そのVBAで記述されたものをマクロとよぶ
といったイメージでよろしいのでしょうか?

たとえば、あるエクセルにはいってるマクロを
実行する、ということを作業マニュアルに記述
する場合
「○○マクロを実行する」というのが
正しいのでしょうか?それとも
「VBAを実行する」というのが正しいのでしょうか?

まったく見当違いのご質問だったら申し訳ありません。
教えてください。

Aベストアンサー

「○○マクロを実行する」というほうが正しいです。

VBAは言語のことです。
マクロとは特定の操作手順をプログラムとして記述して自動化することです。

今回の場合、特定の処理なので「マクロ」という表現を使いましょう。

Q右列に英文、左列に翻訳文を入れたいのですが・・・・

ワードかエクセルでページの左半分に英文、右半分に翻訳文を入れたいのですが・・・・
それも10ページほどの文です
2段組では左右が連続した文になりますね

ワードでセルを使うとセル単位で次のページに飛んでしまいます
エクセルでテキストボックスを貼り付けると
行の中間でページが変わり、文字が読めなくなります
ワードの書式設定で可能なのでしょうか
一番いい方法を教えてください

Aベストアンサー

表が一番簡単だと思うけど。
1行2列の中にペーストでできませんか?
>ワードでセルを使うとセル単位で次のページに飛んでしまいます
どうやってますか?

QVBAとマクロの違い

VBA初心者です。
会社の人からVBAとマクロの違いについて質問され、ちゃんと説明できませんでした。
なにがちがうんでしょうか?
私は「VBAのプログラミング=マクロを組む」と思ってました。
よろしくお願いします。

Aベストアンサー

こんにちは。maruru01です。

Excel(2000)については、No.1の方の説明通り、
「マクロ = VBAというプログラミング言語で記述された一塊の動作」
です。
したがって、miyacさんの、
「VBAのプログラミング=マクロを組む」
で、おおよそあっています。
また、自分で書いたコードをマクロとして登録することも出来ます。
しかし、Access(2000)での"マクロ"は少しニュアンスが異なります。
Accessの場合は、マクロはいくつかの動作・操作は順に登録しておき、それを自動実行させる、という使い方です。自分で書いたコードをマクロとして登録するというやり方ではありません。(本当はそういうやり方も出来ますが。)
したがって、VBAとマクロは何となく別物のような印象を受けます。
それにAccessでは、「マクロを組む」という表現は通常使いません。
ただし、マクロをVBAに変換することが出来ますし、マクロに登録する各動作・操作も、VBAで自分で書くことが出来ます。
ですから、結局同じことなんですけどね。
まとめると、「マクロは自動実行処理を登録すること」で、「VBAはそのアプリケーションのあらゆる操作を記述すること」ですかね。
では。

こんにちは。maruru01です。

Excel(2000)については、No.1の方の説明通り、
「マクロ = VBAというプログラミング言語で記述された一塊の動作」
です。
したがって、miyacさんの、
「VBAのプログラミング=マクロを組む」
で、おおよそあっています。
また、自分で書いたコードをマクロとして登録することも出来ます。
しかし、Access(2000)での"マクロ"は少しニュアンスが異なります。
Accessの場合は、マクロはいくつかの動作・操作は順に登録しておき、それを自動実行させる、という使い方です。...続きを読む

Q花子の図面をワードで正確に表示させる

こんにちは。
どうしてもできなくて、困っています。
ワード2003に花子10で製作した図面をコピペで貼り付けたら、
花子編集画面時は一点鎖線で表記されているものが、
ワードの画面上に戻すと一点鎖線で表記されるべき線が、
普通の線に変化してしまいます。
印刷も普通の線になっています。
図面なので中心線は一点鎖線で表記したいのですが、
不可能なのでしょうか?
よろしくお願いします。

Aベストアンサー

はじまして

ワード2000と花子12で試した結果です。
普通に、花子で図形を選択・コピー、ワードで貼り付けで一点鎖線のままコピーできました。

バージョンが違いますので同じように操作しても結果が異なるかもしれません。
もしうまくいかなければ、以下の2つの方法を試してみてください
1.
花子でコピー → ワードで「形式を指定して貼り付け(“編集”にあります)・図」
2.花子で「解像度を指定して切り出し」でPNGかビットマップでファイル出力 → ワードで「挿入→図→ファイルから」


人気Q&Aランキング

おすすめ情報