アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者です。
日報を入力する作業を、Exel VBAを使って省力化したいと考えています。

1日が1シート、1か月分で1ブックになっています。
いったん別シートにべた打ちしたデータを、VBAで1つずつ各日のシートに貼り付けたいのです。

1枚目のシートのB列のセルB2~B32(1日~31日分に相当)に数値が入っているとして、
これを格納し、
シート「1日」セルF2、シート「2日」セルF2...シート「31日」セルF2
という具合に各シートの同じセル番地のセルに1つずつ貼り付けていくイメージです。

こんなふうに書いてみました。

----------------------------------------
Sub test()
Dim myNum(30) As Integer
Dim i As Integer
Dim j As Integer

For i = 1 To 30
myNum(i) = Worksheets(1).Cells(i + 1, 2)
For j = 1 To 30
Worksheets(i + 1).Cells(2, 6) = myNum(i)
Next j
Next i

End Sub
----------------------------------------

でも、これでは1か月の日数の違いに対応できません。
これ以上はお手上げなので、お知恵を貸してください。
よろしくお願いします。

A 回答 (5件)

#1です。


myNumがintegerだからですね。
そもそも、私が答えた方法だと、myNumは使う必要はありません。
If Worksheets(1).Cells(i + 1, 2) <> "" Then
Worksheets(i + 1).Cells(2, 6) = Worksheets(1).Cells(i + 1, 2)
End If
としてください。
一旦、myNumに入れると、未入力と0の区別が付かなくなったと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
うまくいきました!!

これができると、来週から始まる膨大な作業がとても効率よく行えます。
ありがとうございました。

お礼日時:2011/11/20 13:02

こんにちは!


横からお邪魔します。

Sheet1が入力用Sheetとして、Sheet2以降に各日付のSheetがあるとします。
※ 大の月・小の月がありますので、仮に月末セル(Sheet1のB32セル)が空白の場合もあるかと思います。
その場合はSheet32のF2セルも空白の方が良いとおもいますので、ごく単純に

Sub test1()
Dim i As Long
For i = 2 To 32
Worksheets(i).Cells(2, 6) = Worksheets(1).Cells(i, 2)
Next i
End Sub

こんな感じではどうでしょうか?
的外れならごめんなさいね。m(_ _)m
    • good
    • 0
この回答へのお礼

回答していただきありがとうございます。
的外れだなんて、とんでもない。
まさにこういうことがしたかったんです。
文章もVBAも分かりやすく簡潔で、すごく嬉しかったです。

2度のお手間を取らせた方にベストアンサーを差し上げましたが、
できるなら、tom04さんにもベストアンサーを差し上げたい気持ちです。

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

お礼日時:2011/11/20 13:11

For i = 1 To 30を


For i = 1 To Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row - 1
にしてはどうでしょうか。
For j = 1 To 30は記述を見る限り必要ないと思います。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございます。

セル範囲を選択しておいて、
For i = 1 To Selection.count
とすることも考えたのですが…。

For i = 1 To Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row - 1
のほうが間違いないですね。

お礼日時:2011/11/20 13:05

基本的にVBAでデータ(セルの値その他)を写すのは


(1)セルに代入法
(2)コピー貼り付け法
ガ在る。
本質問のコードは(1)に見える。
コピーと代入には差があるのは判っているよね。
>いったん別シートにべた打ちしたデータを、VBAで1つずつ各日のシートに貼り付けたいのです
質問にしっかり書くべきことは、べた打ちー>各日シートへデータを写すとき、セルの対応関係が同じ位置(行、列)で
無いのだろうがそのことを質問に書いてない。
その対応関係によっては、何十行の、代入のコードを書かなくてはならない。
ーーーー
質問文は長いが、全般に関係ないことを書いてないか?
本題の主題は
For i = 1 To 30
の30を、指定月の月末日にしたいということではないのか。
月の数字をどこかのセルに入れておいて(あるいは変数に入れておいて)、
例えばA列に1-12(月の数字)の数を入れておく、
Sub test01()
For i = 1 To 12
x = Cells(i, "A")
d = DateSerial(2011, x + 1, 1) - 1
Cells(i, "B") = Day(d)
Next i
End Sub
を実行してみる。
B列に月中日数が出る。
このやり方を応用すればしまい。エクセルVBAの定石だ。
ーー
質問のようなやり方は、入力時に参照する原書の項目レイアウトと、作りたいシートの項目順序・レイアウトを切り離せる。
配列に入れる必要は無いだろう。順序を整えて配列に入れるくらいならセルー>セルで代入してしまえば良いのでは。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
簡潔な質問を書けないこと事態が
初心者たるゆえんとご容赦いただければ。
ご指摘の通り、配列に入れる必要はありませんでしたね。

お礼日時:2011/11/20 12:55

Sub test()


Dim myNum(31) As Integer
Dim i As Integer
Dim j As Integer

For i = 1 To 31
myNum(i) = Worksheets(1).Cells(i + 1, 2)
If myNum(i) <> "" Then
Worksheets(i + 1).Cells(2, 6) = myNum(i)
End If
Next i

では、いかがですか?
問題ありありですね。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

セルが空欄かどうかで処理するわけですね。
なるほど!と思ったのですが…

If myNum(i) <> "" Then

のところで「型が一致しません」というメッセージが出てしまいます。

なぜでしょう?
重ねての質問で恐縮です。

お礼日時:2011/11/20 10:55

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