[[20140219114226]] 『マクロで現場別の出勤簿を作っています』(てんとうむし) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで現場別の出勤簿を作っています』(てんとうむし)

マクロの参考書を購入し、出勤簿を作成中です

しかし、前へ進めず困っています。

お知恵をお貸しください。


   A     B     C     D     E    F      

1  日付   担当者名  現場名  日勤数   残業   深夜残業 

2  1 日   社長    ○○    1     2

3  2 日   専務    ××    0.5   

4  3 日   山田    □□    1     1.5    2

5  4 日   専務    △△    1     2     

6  5 日   社長    ○○    0.5    1



上記の表の形で1ヶ月分のデータを入力していきます。
1ヶ月が終わり集計する際に、上記表の右隣に
担当者別・現場別・日勤数・残業・深夜残業
が集計されてほしいのです。
※ 同じ担当者でも現場が複数の場合、同じ現場でも複数に分の合計数があるので
  まとめる式が解りません。


例)

上記のデータを集計した例


担当者     現場名    日勤数    残業     深夜残業

社長      ○○     1.5      3

専務      ××     0.5

         △△     1       2

山田      □□     1       1.5      2


こんな風にしたいのですが・・・

今までは、一回一回オートフィルターを使い担当者ごとにコピーして隣に

表を作成していましたが、マクロで画期的に出来ればと思っています。

よろしくお願い致します。  

< 使用 Excel:unknown、使用 OS:Windows7 >


マクロで作成中とおっしゃるなら、そのマクロを見せて頂かないと、何処を指導すべきか判りませんよ。
ところで、ご提示のデータであれば、マクロ作成せずとも、ピポットテーブルという便利な機能があります。

・データ範囲選択
・「挿入」−「ピポットテーブル」
・行ラベルに「担当者名」「現場名」
・Σ値に「日勤」「残業時間」「深夜残業」
・Σ値の「残業時間」「深夜残業」をクリックし「値フィールドの設定」。集計方法を「合計」に変更
(???) 2014/02/19(水) 15:07


ありがとうございます。

作成中のマクロですが、どういう風にしたらいいのか解らず、何も出来ていない状態でした。

ピポットテーブル、早速 試してみました。

人数が多いので、シートを人ごとに分けていますが

毎回この作業を人数分やるのは大変なので、出来ればボタンをシート上に作成し

ボタン一つで、教えて頂いた作業が瞬時に出来るマクロを作成してみたいのですが

マクロの記録 〜 上記の作業をしマクロの登録をしてみました。

しかし、次に違うシートで そのマクロを使おうとしたところ、出来ませんでした。

シートが変わると、この作業のマクロ登録したのは実行できないのでしょうか?

※ ピポットテーブルを教えて頂いて本当に勉強になりました。

  ありがとうございました。

                              〈 てんとうむし )
(てんとうむし) 2014/02/20(木) 14:03


マクロの自動登録利用で良いですよ。
あとは作業するシートは「当月分」等の固定としておき、古い「当月分」はコピー後にリネーム。
新しいデータを「当月分」に上書き、という運用にすれば、同じマクロを使いまわせるでしょう。

新規追加されるピポットテーブルのシート名は、Sheets(1).Name (元データが左端のシートの場合)
に置き換えると良いです。

また、データ量は毎月違うでしょうから、範囲選択部分は以下のように変えましょう。
Range("A1").CurrentRegion.Select
(???) 2014/02/20(木) 15:32


(???)さん

お返事ありがとうございます。

初心者で、よく解っていないのですが

シートは、人の名前別(一人一人)に分かれています。

例えば、山田・中村・木村・・・などと。

シートの内容は、上記の通りで情報量(仕事をした日にちなども人によって違うためバラバラ)で

ピポットテーブルの貼付け先は既存のシート内(上記処理元データの右隣部分)です。

情報不足で申し訳ありませんでした。

教えて頂いた処理をやってみましたがエラー(オブジェクト定義のエラー等)が出てしまい

どうしたら良いのか・・・?

教えてくださいお願いします。

(てんとうむし)

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _

        "当月分!R2C1:R52C6", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="当月分!R2C8", TableName:="ピボットテーブル2", DefaultVersion:= _
        xlPivotTableVersion14
(てんとうむし) 2014/02/21(金) 10:32

一番最初の例だと、担当者名欄があって、全員分まとまっていましたよね。
担当者別のシートになっているなら、まずは全員1つのシートにまとめてしまえば、ピポットは1つで良いのでは?

複数シートを1つにまとめるのは、それもマクロで実現できます。担当者別シートのフォーマットを
詳しく説明してください。(何行何列はタイトルで、データはどこからどこか判るような例)

あとは、結果を並べる順ですが、キーにできそうな列があればそれも含めてください。社員番号とか。
(???) 2014/02/21(金) 10:52


基本の内容が抜けていて申し訳ありません。

工務店の職人さんの出勤簿の作成になります。 工務店なので、営業さんが数人、職人さんが数人

営業さん一人に対して複数の現場があります。

職人さんの給料計算をするのに営業別(営業の中でも現場別)の細かな枝分かれが必要となります。


● 最初の列の担当者は、営業さんです

● シート一つ一つは、職人さん別になっています。

1つのシート(一人の職人さん)ごとに一か月のデータ(日々、誰が担当の何処の現場に、どれくらい行った)

を入力、月末に 営業・現場ごとに集計 総合計となります。


※ 社員番号は、ありません。

この内容で解りますでしょうか?

(てんとうむし)

 
  

(てんとうむし) 2014/02/21(金) 11:41


・営業さんシートが、ひとつのブックにまとまっているものとします。これにシートを追加します。(当月用?)
・追加したシートに、「開発」−「挿入」−「ActiveXコントロール」の「コマンドボタン」で、ボタンをひとつ置きます。
・置いたボタンをダブルクリックし、以下のマクロを貼り付けます。
・一旦ファイル保存してからブックを開き直し、ボタンを押してみてください。

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim iR As Long
    Dim iw As Long

    iR = 2

    Cells.Clear
    Range("A1") = "営業"
    Range("B1") = "担当者"
    Range("C1") = "現場名"
    Range("D1") = "日勤数"
    Range("E1") = "残業"
    Range("F1") = "深夜残業"

    For i = 1 To Sheets.Count
        If Sheets(i).Name = "ピポット" Then
            Application.DisplayAlerts = False
            Sheets(i).Delete
            Application.DisplayAlerts = True
            Exit For
        End If
    Next i

    For i = 1 To Sheets.Count
        If Sheets(i).Name <> Me.Name Then
            With Sheets(i)
                iw = .Cells(.Rows.Count, "A").End(xlUp).Row
                Me.Range("A" & iR & ":A" & iR + iw - 2).Value = .Name
                .Range("A2:E" & iw).Copy Me.Cells(iR, "B")
                iR = iR + iw - 1
            End With
        End If
    Next i

    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = "ピポット"
    Me.Select
    Range("A1").CurrentRegion.Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
        SourceData:=Selection, Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="ピポット!R1C1", DefaultVersion:=xlPivotTableVersion14
    Sheets("ピポット").Activate
    With ActiveSheet.PivotTables(1).PivotFields("営業")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables(1).PivotFields("担当者")
        .Orientation = xlRowField
        .Position = 2
    End With
    With ActiveSheet.PivotTables(1).PivotFields("現場名")
        .Orientation = xlRowField
        .Position = 3
    End With
    ActiveSheet.PivotTables(1).AddDataField ActiveSheet.PivotTables(1). _
        PivotFields("日勤数"), "日勤数計", xlSum
    ActiveSheet.PivotTables(1).AddDataField ActiveSheet.PivotTables(1). _
        PivotFields("残業"), "残業計", xlSum
    ActiveSheet.PivotTables(1).AddDataField ActiveSheet.PivotTables(1). _
        PivotFields("深夜残業"), "深夜残業計", xlSum
 End Sub
(???) 2014/02/21(金) 13:47

(???)さん

ありがとうございました。

しかし、やってみましたが

セルの幅が変わってしまい、入力した元データも居なくなりピポットテーブルと

一番左には担当者ではなく職人の名前がコピーされて並んでいる状態になってしまうですが

私には、全く解りません。

すみません

(てんとうむし) 2014/02/21(金) 14:07


「営業」を「職人」に書き換えてください(2箇所)。単に見出しが変わるだけであり、内容はシート名です。

人毎のシートが元データですよね? そこは全く触っていないのですが、消えたというのは
具体的にどのシートのどのセルでしょうか?

消しているのは、ボタンを押したシートの内容全て(だからシートを追加して、と書いています)。
あとはピポットテーブルの入ったシートは、毎回消しています。

列幅はピポット完成後に再設定するマクロを追加すると良いでしょう。
(列幅変更は、自動生成させたものを追加する)

あと、1人の担当者が、複数の職人シートにまたがって記入されることはあり得ますか?
今回のマクロでは、1つの元シート(職人毎ですか)の時間数を表示することを優先しています。
(???) 2014/02/21(金) 14:47


あ、見なおしてみたら、日付のない、集計後のデータを再集計していました。作り直し。

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim iR As Long
    Dim iw As Long

    iR = 2

    Cells.Clear
    Range("A1") = "職人"
    Range("B1") = "日付"
    Range("C1") = "担当者"
    Range("D1") = "現場名"
    Range("E1") = "日勤数"
    Range("F1") = "残業"
    Range("G1") = "深夜残業"

    For i = 1 To Sheets.Count
        If Sheets(i).Name = "ピポット" Then
            Application.DisplayAlerts = False
            Sheets(i).Delete
            Application.DisplayAlerts = True
            Exit For
        End If
    Next i

    For i = 1 To Sheets.Count
        If Sheets(i).Name <> Me.Name Then
            With Sheets(i)
                iw = .Cells(.Rows.Count, "A").End(xlUp).Row
                Me.Range("A" & iR & ":A" & iR + iw - 2).Value = .Name
                .Range("A2:F" & iw).Copy Me.Cells(iR, "B")
                iR = iR + iw - 1
            End With
        End If
    Next i

    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = "ピポット"
    Me.Select
    Range("A1").CurrentRegion.Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
        SourceData:=Selection, Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="ピポット!R1C1", DefaultVersion:=xlPivotTableVersion14
    Sheets("ピポット").Activate
    With ActiveSheet.PivotTables(1).PivotFields("職人")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables(1).PivotFields("担当者")
        .Orientation = xlRowField
        .Position = 2
    End With
    With ActiveSheet.PivotTables(1).PivotFields("現場名")
        .Orientation = xlRowField
        .Position = 3
    End With
    ActiveSheet.PivotTables(1).AddDataField ActiveSheet.PivotTables(1). _
        PivotFields("日勤数"), "日勤数計", xlSum
    ActiveSheet.PivotTables(1).AddDataField ActiveSheet.PivotTables(1). _
        PivotFields("残業"), "残業計", xlSum
    ActiveSheet.PivotTables(1).AddDataField ActiveSheet.PivotTables(1). _
        PivotFields("深夜残業"), "深夜残業計", xlSum
 End Sub
(???) 2014/02/21(金) 14:52

(???)さん

初めに言われてた方法を試行錯誤試してみました。

Sub ピポット()
'
' ピポット Macro
'

'

    Range("A1").CurrentRegion.Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "メイン!R2C1:R38C6", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="メイン!R6C8", TableName:="ピボットテーブル1", DefaultVersion:= _
        xlPivotTableVersion14
    Sheets("メイン").Select
    Cells(6, 8).Select
    ActiveWorkbook.ShowPivotTableFieldList = True
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("担")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("現場")
        .Orientation = xlRowField
        .Position = 2
    End With
    ActiveSheet.PivotTables("ピボットテーブル1").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル1").PivotFields("作業時間"), "データの個数 / 作業時間", xlCount
    ActiveSheet.PivotTables("ピボットテーブル1").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル1").PivotFields("残業"), "データの個数 / 残業", xlCount
    ActiveSheet.PivotTables("ピボットテーブル1").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル1").PivotFields("深夜"), "データの個数 / 深夜", xlCount
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("データの個数 / 作業時間")
        .Caption = "合計 / 作業時間"
        .Function = xlSum
    End With
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("データの個数 / 残業")
        .Caption = "合計 / 残業"
        .Function = xlSum
    End With
    With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("データの個数 / 深夜")
        .Caption = "合計 / 深夜"
        .Function = xlSum
    End With
    ActiveSheet.PivotTables("ピボットテーブル1").TableStyle2 = "PivotStyleMedium3"
    ActiveWorkbook.ShowPivotTableFieldList = False
End Sub

こんなエラーが出てしまいました。
(てんとうむし) 2014/02/21(金) 14:58


肝心のエラーメッセージを書いてもらわないと…。
とりあえず、最初とフォーマットを変えましたか? 新しいマクロから読み取れるのは以下です。

・項目名は、「日付」「担」「現場」「作業時間」「残業」「深夜」に変えましたか?
・項目名は2行目にあり、データは3行目からに変えましたか?

もしこの通りであり、データ量は可変にしたいならば、マクロ序盤を以下のように変えてみてください。

    Range("A2").CurrentRegion.Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        Selection, Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="メイン!R6C8", TableName:="ピボットテーブル1", DefaultVersion:= _
        xlPivotTableVersion14
(???) 2014/02/21(金) 17:56

こんにちは。横から失礼します。

頑張っておられますね。でも、ピボットテーブルは、必要になるつど
新規に作成しなくてもいいと思いますが? 一度作ったら消さずに
そのまま置いておいてはどうでしょう。

ただし、ピボットテーブルでは元になるデータが書き換えられても
自動的に再計算はされません(関数と違うところです)。手動で、
またはマクロで更新してやる必要があります。

もうひとつ「ただし」があります。
ピボットテーブルでは作成時に指定した集計対象範囲の外にデータが
追加されても、対象範囲が自動的に広がるということがありません。
不便です。これをなんとかするには、集計対象の範囲をまず「テーブル」
にし、その上で、ピボットテーブルを作ります。
テーブルなら、データが追記されたら自動的にテーブルの範囲が広がります。

( 佳 ) 2014/02/21(金) 18:58


こんにちは。連投失礼します。

マクロの記録で作ったコードの読み方にはコツがあります。

コツその1
できるだけ短いコードを記録させることです。
「一連の手順」を一気に記録すると、どの部分でなにをしているのかわかりません。
面倒ですが、手順をひとつずつ別々に記録したほうが、結局読みやすいです。

コツその2
よく似ているが少し違うコードをいくつか記録して見比べることです。
今回のピボットテーブルだと、集計元の範囲を変えてみるとか、フィールドの
配置をすこしだけ変えてみるとかです。
作業内容を変えた結果 記録されたコードが変わったなら、その変わった部分が
その内容に対応していると判断できます。

こういうことを積み重ねているうちに、少しずつ、記録マクロ以外のコードも
読めるようになっていきます。がんばってください。

( 佳 ) 2014/02/21(金) 19:11


(???)さん
(圭)  さん

色々教えて頂いて本当に、感謝しています。

しかし、とても初心者の私には難しく 教える方はイライラされていると思います。

でも、やってみたいんです!出来るようになりたいんです!

もう少し、お付き合いください。

(???)さん、・項目名は、「日付」「担」「現場」「作業時間」「残業」「深夜」に変えました!
        ・項目名は2行目にあり、データは3行目からに変えました!

作り直していただいた式をコピーし貼り付けてみましたがエラーがでます。

エラー内容は : コンパイルエラー : Meキーワードの使用方法が不正です

と・・・

(補足)

一人の営業が複数のシートにまたがっています。
同じ日に10人が同じ営業の同じ現場に行っていることもあり一か月の間、日にちは違っていても数日は重なりますので・・・

ピポットテーブルも一回一回消えなくて大丈夫です!(残っている方が助かります)

やりたい事を言葉にして説明するのが下手くそで本当に、ごめんなさい。

(てんとうむし) 2014/02/24(月) 13:53


Meというのは自分のシートを指します。これがエラーということは、マクロを標準モジュールに
貼っているのではないかと思います。

シートにコマンドボタンを貼り、これを押すと動作するようにした場合、シートにマクロが貼られます。
マクロの置き場所を変えてみてください。

または、Meの部分を、Sheets("メイン") のように、元データのあるシート名に変えてみてください。

ちなみに、毎回ピポットを貼ったシートを削除していたのは、元データの範囲が毎月変わる事を
想定しての事です。ピポット更新だけでも良いのですが、範囲指定の変更と全部作成では、
全部作成の方が真っ更な状態からでも動作できて良いかな、と思いました。
(更新するマクロの場合、最初のピポットをどういう手順で作成しているのかを、私が最初に説明したように
細かく説明していただくことになり、面倒かな、と思います)
(???) 2014/02/24(月) 14:46


(???)さん

標準モジュールになっているようですが、どうやったらマクロの置き場所が変えられるか解らなくて、

VisualBasic→コピーした上記の式を張り付け→実行(ユーザーフォームの実行)→コンパイルエラー

(Sab Endが必要です) となってしまいます。

自分のやったピポット政策の手順を詳しく付け加えたいと思います。

●シートの名前は”日報 ” ボタンはピポット作成してから教えて頂いた手順で作成。

マクロの記録→マクロ名(集計)→マクロの保存先(個人用マクロブック)→OK

範囲を選択(A2〜F50)→挿入→ピポットテーブル→テーブル範囲(日報!$A$2:$F$50)既存ワークシート

場所(日報!$H$6)

行ラベル→担→現場→Σ値→作業時間→残業→深夜(データの個数→値フィールドの設定→合計→OK)

マクロの終了

開発→挿入→フォームコントロール→ボタン(H3に置く)→マクロ登録→PERSONALXLSB!集計→OK

●シートの内容としましては

   A    B    C    D    E    F  

1  坦   日付  現場  作業時間  残業  深夜

2

3

4

5

※ 集計ボタンをクリックすると、H6にピポットテーブルが集計された状態で現れる。

このシートをシートのコピーで増やせて(職人の人数分)いけたら一番良いのですが・・・

シートは、職人別に(1シート1人の職人分のデータ)

担当者、同じ現場は複数のシートにまたがります。(ひと月の間に同じ現場に同じ日に何人もの職人が

行くこともあります)

1月・2月・・・と月ごとにファイルを作りますのでデータは、見返せるように残しておく状態がベストです

上記の内容でマクロ記録のデータを下に貼り付けておきます。

このないようです。↓

Sub 集計()
'
' 集計 Macro
'

'

    Range("A2:F50").Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "日報!R2C1:R50C6", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="日報!R6C8", TableName:="ピボットテーブル2", DefaultVersion:= _
        xlPivotTableVersion14
    Sheets("日報").Select
    Cells(6, 8).Select
    ActiveWorkbook.ShowPivotTableFieldList = True
    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
    ActiveSheet.PivotTables("ピボットテーブル2").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル2").PivotFields("作業時間"), "データの個数 / 作業時間", xlCount
    ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("データの個数 / 日付").Orientation _
        = xlHidden
    ActiveSheet.PivotTables("ピボットテーブル2").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル2").PivotFields("残業"), "データの個数 / 残業", xlCount
    ActiveSheet.PivotTables("ピボットテーブル2").AddDataField ActiveSheet.PivotTables( _
        "ピボットテーブル2").PivotFields("深夜"), "データの個数 / 深夜", xlCount
    With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("データの個数 / 作業時間")
        .Caption = "合計 / 作業時間"
        .Function = xlSum
    End With
    With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("データの個数 / 残業")
        .Caption = "合計 / 残業"
        .Function = xlSum
    End With
    With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("データの個数 / 深夜")
        .Caption = "合計 / 深夜"
        .Function = xlSum
    End With
    ActiveWindow.SmallScroll Down:=-18
End Sub

宜しくお願い致します。

(てんとうむし) 2014/02/26(水) 13:05


VBAの編集画面を表示できていますね。ならば、画面左側のツリーのなかで、元データのあるシート名を
ダブルクリックし、右側に表示された部分に今回のソースを貼り付け、実行してみてください。
(Sub 集計() で始まって、End Sub で終わっているので、これなら動くはずです)

それでもエラーになるのでしたら、実行(F5)の代わりにF8キーを使って、1行ずつ動かしてみてください。
そして、どの行まで動いて、どういうエラーが出るかを調べてください。
(???) 2014/02/26(水) 13:51


あと注意点ですが、今回の処理はシートにボタンを置いてしまえば済むレベルであり、
フォームを追加する必要はないし、逆に難しくなって判らなくなりそうです。

更に、PERSONALXLSへは、Excelブック全てに共通するマクロを置くべきであり、
通常は使わないほうが良いと思います。ブック(シート)固有のマクロの方が、
別のブックに影響しないのです。
(???) 2014/02/26(水) 14:15


(???)さん

やはりエラーが出ています。(元シートは、ちゃんと動くのにコピーシートの方はエラー

です。)

エラー内容は: 実行時エラー”1004 ”
        アプリケーション定義またはオブジェクト定義のエラーです

Alt → F11 → F8 を押して行ったところ

デバッグ内容:

 Sub 集計() ←が黄色くなり

  Range("A2:F51").Select ←が黄色くなり

   ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "日報!R2C1:R51C6", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="日報!R6C8", TableName:="ピボットテーブル1", DefaultVersion:= _
        xlPivotTableVersion14 ←が黄色くなり

エラー”1004 ”となります。

※ 保存先=作業中のブックに変更してマクロの登録

※ F11で内容を見たときに思ったのですが、

    Moduie1

       Sheet5(日報)

  とならんでおり、Sheet5(日報)をクリックすると中身が空で、モジュールの方に今回のマクロの
  
  内容が入っていたので、中身をコピーしSheet5(日報)の方に移しモジュールを削除しました。

  しなかった方がよかったのでしょうか?

(てんとうむし) 2014/02/27(木) 10:14


コピーシートでもマクロ自動記録してみて、違いを確認すれば、何処を直すべきか判るでしょう。

今回の場合は、同じブックの複数のシートに同じマクロを書いて実行しているわけですね?
そうなると、テーブル名が重複してしまいませんか? 自動記録すると、違う名前になるはず。

標準モジュールを消して、シートの方に書いたのは正解です。説明した手順通りにシートにボタンを
貼っていれば、標準モジュールには書かなかったはず。(自動記録は標準モジュールに記録しますが)
複数シートそれぞれに元データがあるならば、それぞれのシートにマクロを書きましょう。
(全部まとめて1つのシートにした方が、複数シートにある同一人物の集計もでき、使いやすいと思うのですが…)

あと、毎月変わるデータ量に対応すべく、CurrentRegion.Selectする方法を書きましたが、採用して
いないようですね。これだと、毎月マクロの範囲指定箇所を変更しないといけませんよ?
(表範囲自動指定後に SourceData:=Selection としていたところが該当します)
(???) 2014/02/27(木) 10:29


(???)さん

集計シートと集計2シートの違いは、この部分でした

集計シート:      ↓

    ActiveWorkbook.Worksheets("日報 (3)").PivotTables("ピボットテーブル1").PivotCache. _							
        CreatePivotTable TableDestination:="日報!R6C8", TableName:="ピボットテーブル6", _							
        DefaultVersion:=xlPivotTableVersion14							

集計2シート:

    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _							
        "日報 (2)!R2C1:R51C6", Version:=xlPivotTableVersion14).CreatePivotTable _							
        TableDestination:="日報 (2)!R6C8", TableName:="ピボットテーブル7", DefaultVersion _							
        :=xlPivotTableVersion14	

テーブル名は”ピポットテーブル1 ” ”ピポットテーブル2 ”のように異なっていました。

違う部分は、発見できたのですが 対処法が解りません。

※ 現在、職人は8人居ます。 この集計から次に、全体の大きな集計、次に担当者別(中身は現場別)

  の集計と、どんどん枝葉があり 毎月 職人ごとに印刷したり 確認(見直し)したりするので

  シートが別で一目で全体が見れるようにしていた方が、都合がよく・・・

  こんな形になっております。

※ 教えて頂いた CurrentRegion.Selectする方法ですが、ソースの、どの部分を差し替えたら良いのか

  よく解らなくて・・・    

(てんとうむし) 2014/02/27(木) 14:47


うまくいっているマクロの、シート名部分とテーブル名部分を変えれば動くと思うのですが…。
とりあえず「集計シート」の方でも、シート名が違っていたりするので、これ動いています?
SourceDataの指定もありませんし。前に書いてくださったマクロでは指定していましたよね。

いずれにせよ、自動作成された、ピポットを作成するマクロを2回動かすと、2回目は既に同じ名前の
テーブルがあるので、失敗します。だから、前に作成したテーブルを削除しないといけません。
私の書いた例では、シートを削除して対応していました。

テーブルを作成するマクロだけでなく、元テーブルを削除するところもマクロ記録してみてください。

または、削除するのが嫌なのであれば、作成マクロはやめて、更新するマクロを記録し、
これを実行する案もあります。
この場合、初回作成はそれぞれのシートで、手作業で行うことになります。
(???) 2014/02/27(木) 18:49


更新だけのマクロを書いておきますね。
元データのあるシートと同じシートにピポットが1つだけ作成されているとして、表は2行目先頭から存在するものとします。
同じシートに、ActiveXのボタンを1つ貼っておきます。

 Private Sub CommandButton1_Click()
    Range("A2").CurrentRegion.Select
    PivotTables(1).SourceData = Selection.Address
 End Sub
(???) 2014/02/28(金) 08:57

(???)さん

ずいぶんと間が空いてしまいましたが、知識の無い私では なかなか

やりたい事が形にならず、失敗ばかりで教えて頂いた事も、うまく行きません。

結局、一つのシートに一か月分の全部のデータを入力し最終的に月の月末分まで入力した後

ピポットを別シートに作成し集計と言う形に持って行きました。

枝葉の作業が多く(職人一人一人の給料計算・現場ごとの集計・営業担当者ごとの集計・

一か月全体の集計など) 出来れば、職人別に この人は いつ何処の現場にどれだけ行ってる

(一日の中で、いくつもの現場を時間単位で行って仕事をする日もあるので一人で現場が沢山ある人も

あります)などと、一目で解るようにシートを分け 一人一人のシートの中でピポットがあり

別シートで全員分(全シートのピポットの合計?集計)を出せたら理想だったのですが

私の知識では、教えて頂いた事が出来ないので すみませんでした。

今回、色々教えて頂き 本当に勉強になりました。

マクロの本を読んでも応用などは書いてなくて・・・

また、知恵をお借りする事があると思いますが、よろしくお願い致します。

ありがとうございました。

(てんとうむし) 2014/03/13(木) 11:15


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.