|
▼よしまん さん:
おはようございます。
>VBAをなんとか理解できるが、自分で記述するまではまだ力がたりない初心者で、もし以下のことをVBAで自動化できないものかと思っておりまして、アドバイスいただけると幸いです。エクセル2002を使っています。
>
>やりたいことは以下の2点です。
>
>1.以下のような表があります。
>
> No | 氏名 |8/1| 〜 |8/31|←列見出し
> −−−−−−−−−−−−−−−−−−−−−−−
> 154| 山田 | 1 | 〜 | 1 |
> 187| 横山 | 1 | 〜 | |
上記の表があるシートをSheet1とし、項目名NoがセルA1から始まっているとします。
>この表は各個人(約300名)の毎月のある実績について、実績があればその該当日(列見出し)のセルに「1」を入力して、各個人の実績を列方向に管理を行っており、月ごとに私がその提出を受けているものです。
>
>この表でまず、「1」を実際の日付に置き換えたいのです。1行ごとに行を挿入し、if関数をつかい、数式をコピーして、あとで行を削除するなどとできないことはないのですが、手作業ということで、ミスが発生しやすくなるため、VBAで自動化できないものだろうかというのが1つめの質問です。
>
>2.なぜ1のようにしたいのかといいますと。1で整理した表を最終的に以下のような表に整理して、アクセスにインポートしたいからなのです。整理したいという表は
>
> 個人氏名 | 日付 | ←列見出し
> −−−−−−−−−−−−−−−−−−
> 山田 |8/1 |
> 山田 |8/31 |
> 横山 |8/1 |
> 横山 |8/25 |
上記の表があるシートをSheet2とし、項目名、個人氏名がセルA1から始まっているとします。
Sheet1の表から、Sheet2の表が作成する事が目的ですね?
(つまり、Sheet1の表中の「1」を日付けに変換する処理は過程処理で
要りませんよね?)
以下に示すマクロを実行する前に、
・Sheet1の形式でサンプルデータの準備
・Sheet2の形式の項目名のみ作成
・Sheet2の表の日付けセルの書式を"m/d"にしておく
等を行っておいてください。
では、コードです。
'=====================================================================
Sub main()
Dim d_cell As Range
Dim rng As Range
Dim sht2 As Worksheet
Dim wk() As Variant
Dim ans() As String
Dim shx As Long, idx As Long
With Worksheets("sheet1")
Set rng = .Range("a2", .Cells(.Rows.Count, 1).End(xlUp))
If rng.Row <= 1 Then
MsgBox "データ無し"
End
End If
Set d_cell = .Range(.Cells(1, 3), .Cells(1, .Columns.Count).End(xlToLeft))
'↑項目の日付セル範囲を取得
End With
Set sht2 = Worksheets("sheet2")
shx = 2
For idx = 1 To rng.Count 'Sheet1のデータ分繰り返す
Erase wk()
Erase ans()
ad = rng.Cells(idx).Offset(0, 2).Resize(1, d_cell.Count).Address(, , , True)
wk() = Evaluate("=if(" & ad & "=1,text(" & d_cell.Address(, , , True) _
& ",""m/d""),""×"")")
ans() = Filter(wk(), "×", False, vbTextCompare)
'↑ 1のセルを取得し、日付に置き換えた配列を取得する
If UBound(ans()) - LBound(ans()) + 1 > 0 Then '日付けデータがあったら?
sht2.Range(sht2.Cells(shx, 1), _
sht2.Cells(shx + UBound(ans()) - LBound(ans()), 1)).Value = _
rng.Cells(idx, 2).Value
'↑名前をセット
sht2.Range(sht2.Cells(shx, 2), _
sht2.Cells(shx + UBound(ans()) - LBound(ans()), 2)).Value = _
Application.Transpose(ans())
'日付けをセット
shx = shx + UBound(ans()) - LBound(ans()) + 1
'Sheet2の行インデックスの更新
End If
Next idx
Erase wk()
Erase ans()
End Sub
Excel2000で確認しました。
|
|