質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

3739閲覧

VBA 連想配列にて書き出し方法がわかりません

dacchi2000

総合スコア27

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/05/31 06:50

###前提・実現したいこと
VBAにて工数管理を作成しています。
一枚目にある画像で記入した項目を登録ボタン押下することで該当する大分類のシート(2枚目画像)に移動して1枚目の画像に表示してある日付(D3)、中項目、領域全てが一致した場所に、掛かった工数を入力されるようにしたいと思っています。
連想配列を使用して日付以外の項目は配列への読み出し、書き出しがうまくいっている(はず)ですが、2枚目の画像の日付がある列を指定してあげる良い方法が思いつきません。
大分類は4種類あり、2枚目画像のA4部分(青く塗りつぶされ部分)が大分類になり、中分類はA7〜A24(大分類によって項目数は異なる)、領域はG7〜G24(3項目固定)になります。
ところどころ変なコメントがありますがスルーしてもらうと助かります・・・

イメージ説明
イメージ説明

###該当のソースコード

VBA

1Sub record() 2 3 Dim Sheet1, Sheet2 As Worksheet 4 Const COL大分類 = 4 '大分類の列 5 Const COL中分類 = 6 '中分類の列 6 Const COL領域 = 9 '領域の列 7 Dim MAXRow As Long '最終行 8 Dim Key As String '検索キー 9 Dim c, r, i As Long 10 Dim Today As Date '日付 11 Dim dic As Class1 'Dictionaryオブジェクト呼び出し 12 13 14 Set dic = New Class1 '連想配列の定義 15 16 Set Sheet1 = Worksheets("工数入力") 17 Set Sheet2 = Worksheets("月次表(その他)") 18 19 Today = Worksheets("工数入力").Range("D3").Value '登録する日を格納 20 21 MAXRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row '最終行を求める 22 23 24 '各工数の時間を連想配列へ読み込む 25 With Sheet1 26 For r = 9 To MAXRow '最終時間まで 27 Key = .Cells(r, COL大分類).Value & .Cells(r, COL中分類).Value & .Cells(r, COL領域).Value & .Cells(3, 4).Value '大分類&中分類&領域&日付 28 dic(Key) = dic(Key) + 0.5 '工数計算 29 Next 30 End With 31 32'-----------------各月次表への書き出し----------------- 33 c = Today 'ここが違うと思う 34 35 With Sheet2 'とりあえずその他シートで実験 36 For i = 4 To 19 + 3 '中項目(項目追加されたら編集) 37 For r = 7 To 36 '領域 38 Key = .Cells(4, 1).Value & .Cells(i, 1).Value & .Cells(r, 7).Value & .Cells(2, c).Value '大分類&中分類&領域&日付(日付が違うはず・・・) 39 .Cells(r, c) = dic(Key) '↑同様列の指定がNG 40 Next 41 Next 42 End With 43 44 MsgBox "登録完了しました。" 45 46End Sub 47

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
Macを使用しているので連想配列の定義は下記のURLを参考にしました。
http://fccreator.blogspot.jp/2014/03/macmacexcelvbadictionary.html
OfficeはOffice 365 Soloを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

連想配列のキーにする日付の部分をどういった書式にするかは決まってますか?
年月日?20160531
日のみ?31

とりあえず年月日としましょうか。
Sheet1のD3セルはどういった値ですか?
見た感じタイムスタンプ値で、書式設定で表示形式を変えているのでしょうか。
だとすれば、最初の連想配列に使われる日付部分(.Cells(3, 4).Value)の値は、2015/05/31という値になりますね。

c = Todayの部分。
変数cは後にカラムの位置を示すわけですから、日のみを取り出した方が良いですね。
そしてSheet2の日付開始位置J列に合わせます。
c = Day(Today) + 9

あと確認するところはSheet2のJ2:AN2の値ですが、ここはタイムスタンプ値でしょうか。
そうであれば2回目のキーを作っているところの.Cells(2, c).Valueは、YYYY/MM/DDになるので問題ないと思います。

投稿2016/05/31 07:24

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dacchi2000

2016/05/31 09:26

解答ありがとうございます。 Sheet1のD3はyyyy/mm/ddの値になっており、表示形式としてdd"日"としています。 問題はJ2:AN2の値ですが、こちらはJ2の中に=DATE(A2,F2,1)の関数を入れており、 そこからAN2まではJ2+1...と続いていますのでどのようにして、J2:AN2をyyyy/mm/ddと変えてddだけ表示させたらよろしいでしょうか?
ttyp03

2016/05/31 09:30

=DATE(A2,F2,1) になっているのなら、問題ないように思えますが。 最初のKeyの値と、2回目のKeyの値はどうなってますか?どう違いますか?
dacchi2000

2016/06/01 00:48

ご連絡遅くなってしまい申しわけありません。 値の確認ですがMacだとデバッグのやり方が違って確認に手間取ってしまっています。 今出てるエラーは「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 というエラーが出ていてエラーの場所が該当セルへの書き出し(コードでいう.Cells(r, c) = dic(Key) '↑同様列の指定がNG)の部分で出てしまっています。
ttyp03

2016/06/01 01:34 編集

Macは触ったことないのでデバッグ方法がどうなっているかはわかりませんが、ウォッチとかDebug.printは使えないのでしょうか。 ブレークポイントで止めてKeyの値を参照するとか。 それからエラーが出ているところですが、推測になりますが、連想配列dicにKeyで指定されるキーが存在していないために出ているような気がします。 存在しているかのチェックをして、あればセルに代入する方がいいかもしれませんね。 If dic.Exists(Key) then .Cells(r, c) = dic(Key) End If ※dicがクラスになっているようなので、Existsが使えるかはわかりません。
dacchi2000

2016/06/01 02:35

Debug.printは使えるみたいなのですが、ブレークポイントで止めてもKeyの値が参照できません。 というより、Existsを使ってみると何も出力されず全ての処理が終了してしまいました。 私の推測ですが、読み込みのタイミングでKeyの中に値が読み込まれていないのではないかと思われます。
ttyp03

2016/06/01 04:23

立て込んでて即答できないのですが、まずはCellsで参照している先が、想定しているセルをきちんと指しているか確認してみてください。 あとこれも原因のひとつかと思いますが、 For i = 4 To 19 + 3 '中項目(項目追加されたら編集) このFor文は恐らく For i = 4 To 19 Step 3 '中項目(項目追加されたら編集) ではないでしょうか。
dacchi2000

2016/06/01 08:10

確認したところ参照先が想定してる場所とは異なっているみたいなので、 もう一度練り直します。 ご迷惑おかけして申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問