ExcelでVBAが必要かどうか、またはピボットチャート/テーブルで十分かどうかを判断する


1

この質問をより正確に説明するタイトルがあればいいのですが、ExcelスプレッドシートやVBAについてはあまり知識がありません(私は主にJava開発者であり、Microsoftの世界ではあまり遊んでいません)。

Excelスプレッドシートを使用して何かを達成しようとしています。PivotTable、Pivo​​tChart、またはその他の組み込み機能を使用してそこに到達できるかどうか、またはカスタムVBAコードを記述する(または別のプラットフォームを使用する)必要があるかどうかを判断する必要があります。

スプレッドシートの目的は、組織(Toastmastersクラブ)のスケジュールの作成を支援することです。この組織にはメンバー名簿があり、毎週会合を持ち、さまざまなメンバーが特定の会議でさまざまな役割に割り当てられます。

私のスプレッドシートは次のようになります。

最初のタブ

1列...メンバーシップ名簿を表す名前のリスト。

2番目のタブ

各行は過去の会議日を表します。各役割には列があり、セルにはその日付でその役割を担当した人が入力されます。データ検証を使用して、各セル内で最初のタブの名簿をプルダウンとして使用できるようにします。

3番目のタブ(複数のタブがありますか?)

これが全体のポイントです。可能な会議の役割ごとに、どのメンバーがその役割に割り当てられる最も「期限切れ」であるかを確認したいと思います。基本的に、私はすべてのクラブ会員のリストを、その役割を最後に務めてからの期間でソートしたいです。その役割を一度も務めたことがない人は、リストの一番上にソートされます。

その3番目のタブデータは、ピボットテーブルなどで実現できるものですか?それとも、これらのツールの目的と制限を誤解していますか?

回答:


0

誤解した場合は修正してください。あなたのデータはそのようなものです:

最初のタブ(シート):

Name
----
Alice
Bruce
Chuck
Derek
Emily

2番目のタブ:

Date        Role1    Role2    Role3
--------    -----    -----    -----
13-01-11    Alice    Bruce    Chuck (Each selected from dropdown)
14-01-11    Derek    Emily    Bruce
15-01-11    Alice    Chuck    Derek
16-01-11    Emily    Bruce    Alice
17-01-11    Chuck    Derek    Bruce
18-01-11    Chuck    Bruce    Alice
19-01-11    Alice    Chuck    Bruce

その場合、Pivo​​tTableは、Mikeが記述した形式に変換しない限り適用できません。

代わりに、(編集:同じタブで各ロール列を分離し、アルファベット順に並べ替えた後)つまり、次のように2番目のタブを作成します(カット-ペースト-ソート):

Date        Role1
--------    -----
13-01-11    Alice
15-01-11    Alice
19-01-11    Alice
17-01-11    Chuck
18-01-11    Chuck
14-01-11    Derek
16-01-11    Emily

Date        Role2
--------    -----
13-01-11    Bruce
16-01-11    Bruce
18-01-11    Bruce
15-01-11    Chuck
19-01-11    Chuck
17-01-11    Derek
14-01-11    Emily etc

次に、各ロールにタブを作成し(または同じタブにタブを分けて)、LOOKUP関数を使用して、メンバーがそのロールを最後に実行した時間を確認できます。たとえば、Role1の場合、タブ3は次のようになります。

Name     Last Done (Date)
----     -------- 
Alice    19-01-11 [=LOOKUP(A2,Sheet2!$B$2:$B$8,Sheet2!$A$2:$A$8)]
Bruce    N/A
Chuck    18-01-11
Derek    14-01-11
Emily    16-01-11

最新のものから古いものに並べ替えると、誰が一番上で役割を果たしたことがなく、誰が一番下で最後にやったかを見ることができます。

また、COUNTを使用して特定の役割を誰かが行った回数、およびTODAYを使用して差を取得することで前回から経過した日数/週数の列を追加することもできます。

異なるタブで、他のロールに同じ機能をコピーして貼り付けます(多くない場合)。


LOOKUP数式では、2番目のパラメーターのセル範囲を並べ替える必要はありませんか?
スティーブパーキンス

はい、昇順で言及するのを忘れました。同じタブでロールを分離し、各メンバーをアルファベット順に並べ替えることができます。したがって、日付行も昇順になります。
ガニシムセック

このアイデアのおかげで、ピボットテーブル VBAを使用せずにこれを行う方法を見つけることは期待していませんでした(これにより、このスプレッドシートを継承する次の人が簡単になります)。ただし、完全に一致するものがない場合に「次に大きい」一致を使用するLOOKUPの動作は信頼できません。したがって、Date列を右端に移動し、代わりにVLOOKUP関数を使用すると思います。
スティーブパーキンス

0

個人的にはVBAを使用しますが、一般的にはそのように傾いています。あなたがVBAの男ではない場合、数式とピボットテーブルを使用すると、保守が容易になる場合があります。ただし、いくつかの犠牲を払う必要があります。それで、犠牲があなたに受け入れられるかどうか見るために、非VBA方法を調査する価値があります。これが一つの方法です。

名簿シートで、すべての役割の列を追加します。私の例では、社長と秘書という2つの役割があります。A列には名前が、B列には社長、C列には秘書というタイトルが付けられています。B2に次の式を入れます

{=MAX((OFFSET(Meetings!$A$1,1,MATCH(B$1,Meetings!$B$1:$C$1,FALSE),20,1)=$A2)*(OFFSET(Meetings!$A$2,0,0,20,1)))}

この式には、私が間違いなくより堅牢にするという仮定がいくつかありますが、それは概念の良い証明です。これは配列数式であるため、Control + Shift + Enterで入力します。President列にその名前で見つかった最大日付が返されます。データに合わせて、その式を右下に入力します。

次に、名簿シートのデータを使用して、「ロール」列ごとにピボットテーブルを作成します。行領域に名前を入力し、データ領域にロール(例:President)を入力します。おそらくデフォルトで大統領の数になります。そのフィールドを右クリックして、[フィールド設定]を選択します。[集計方法]を[最大]に変更し、数値形式を日付に設定します。

次に、いずれかの名前を右クリックして、フィールド設定を選択します。[詳細設定]ボタンをクリックします。AutoSortオプションをMax of PresidentのAscendingに変更します。

結果は、ソートされた名前のリストになります。トップの名前は大統領にならずに最長になりました。

例に勝るものはありません。ここからダウンロードしてくださいhttp://www.dailydoseofexcel.com/excel/Rotary.zip これには、上記で説明した内容を示す1つのExcel 2003ブックが含まれています


0

はい、ピボットテーブルで十分です。2番目のタブでデータを適切に設定します。

以来のメンバーの役割の週
1/12/2010メンバー1ロール1 8 [=(TODAY()-A2)/ 7]
1/12/2010メンバー2ロール2 8
1/12/2010メンバー3ロール3 8
1/12/2010メンバー4ロール4 8
1/12/2010メンバー5ロール5 8
2010年8月12日メンバー1ロール1 7
2010年8月12日メンバー3ロール2 7
2010年8月12日メンバー7ロール3 7
2010年8月12日メンバー6ロール4 7
2010年8月12日メンバー4ロール5 7
15/12/2010メンバー1ロール1 6
2010年12月15日メンバー3ロール2 6
15/12/2010メンバー4ロール3 6
15/12/2010メンバー2ロール4 6
15/12/2010メンバー6ロール5 6
22/12/2010メンバー1ロール1 5
22/12/2010メンバー2ロール2 5
2010年12月22日メンバー5ロール3 5
22/12/2010メンバー3役割4 5
22/12/2010メンバー4役割5 5
2010/12/29メンバー2ロール1 4
2010/12/29メンバー3ロール2 4
2010/12/29メンバー4ロール3 4
2010/12/29メンバー5ロール4 4
2010/12/29メンバー5ロール5 4
...

その後、次のようにピボットテーブルを作成できます。

レポートフィルター:なし

列ラベル:なし

行ラベル:ロール、メンバー

値:MINからの週

次に:

  • 不要な合計フィールドを削除する
  • [メンバー]フィールドの設定を編集し、[レイアウト]および[データのないアイテムを印刷/表示]を選択します。これにより、役割を一度も務めたことがないメンバーが表示されます。
  • 最小から最大への週の順序を並べ替えます。

pivorテーブルは次のようになります。

役割メンバーの最小週
ロール1メンバー4        
            メンバー7        
            メンバー3        
            メンバー5        
            メンバー6        
            メンバー2 4
            メンバー1 5
ロール2メンバー4        
            メンバー7        
            メンバー6        
            メンバー1        
            メンバー5        
            メンバー3 4
            メンバー2 5
ロール3メンバー6        
            メンバー1        
            メンバー2        
            メンバー4 4
            メンバー5 5
            メンバー7 7
            メンバー3 8
ロール4メンバー7        
            メンバー1        
            メンバー5 4
            メンバー3 5
            メンバー2 6
            メンバー6 7
            メンバー4 8
ロール5メンバー7        
            メンバー1        
            メンバー3        
            メンバー2        
            メンバー5 4
            メンバー4 5
            メンバー6 6

Excel 2010でテスト済み。


0

ここでは、3つの部分からなるわずかに異なるアプローチ:

  • データ入力テーブル-各セッションで、誰かがロールプレーヤーとロールを入力します。テーブルは日付でソートされます(降順)。
  • 相互参照表-各役割で提供された最新の日付に相互参照された各名前
  • 次のリスト

メンテナンスが非常に少ないです。一度設定すると、毎日3つの名前を入力し、必要に応じて日付範囲を拡張するだけです。

データ入力テーブル

これが表(A1:D10)です。注:ここには数式はありません。毎週、次の次のリストに基づいて3つの名前を入力します。

Date    Role1   Role2   Role3  
21-Jan            
20-Jan            
19-Jan  Alice   Chuck   Bruce  
18-Jan  Chuck   Bruce   Derek  
17-Jan  Chuck   Derek   Alice  
16-Jan  Emily   Bruce   Chuck  
15-Jan  Alice   Chuck   Emily  
14-Jan  Derek   Emily   Alice  
13-Jan  Alice   Bruce   Emily  

相互参照表

以下の相互参照表(A14:D19)は、各名前が各役割を実行した最新の日を表示します。

=IF(ISNA(MATCH($A15,B$2:B$10,0)),"",INDEX($A$2:$A$10,MATCH($A15,B$2:B$10,0)))

Name    Role1   Role2   Role3   Role4  
Alice   19-Jan          17-Jan  18-Jan  
Bruce           18-Jan  19-Jan  14-Jan  
Chuck   18-Jan  19-Jan  16-Jan  13-Jan  
Derek   14-Jan  17-Jan  18-Jan  19-Jan  
Emily   16-Jan  14-Jan  15-Jan  17-Jan  

すべての名前が少なくとも1回は役割を実行した場合、一致する最新の日付が提供されます。名前が役割を実行したことがない場合は空白のセル

次のリスト

Next Upセクション(A12:D12)は、各ロールの列で最も早い日付を探し、一致する名前を提供します。列の最小数を見つけて、その行を返すことで機能します。空のセル(実行されない)が優先されます。

=IF(ISNA(MATCH("",B$15:B$19,0)),INDEX($A$15:$A$19,MATCH(MIN(B$15:B$19),B$15:B$19,0)),INDEX($A$15:$A$19,MATCH("",B$15:B$19,0)))

Next-Up Role1   Role2   Role3  
Name    Bruce   Alice   Emily  

すべての数式を上下にドラッグできます。日付範囲を拡張する場合は、行2の下に追加の行を挿入すると、数式は引き続き機能します。たとえば、1月31日まで拡張するには、行3:12を選択して挿入し、セルA13:A14を選択して、ハンドルをセルA2までドラッグします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.