- ベストアンサー
エクセルVBAシート転記でエラー1004
- エクセルVBAでシート間の転記を行う際にエラー1004が発生します。週入力シートのD5セルから下に入力されている内容を転記シートの同じセル範囲へ転記したいです。現在、転記先の開始位置としてD5セルを決め打ちしていますが、変数を使用して列の変更に対応したいと考えています。以前はfor next文を使用して1行ずつ転記していましたが、データ量が多く時間がかかるため、時間短縮のためのコードを検討しています。
- エクセルVBAのシート間転記において、実行時エラー1004アプリケーション定義またはオブジェクト定義のエラーが発生しています。週入力シートのD5セルから下に入力されている内容を転記シートの同じセル範囲へ転記したいです。転記先の開始位置としては現在D5セルを使用していますが、将来的に列の変更に対応できるように変数を使用したいと考えています。以前はfor next文を使用して1行ずつ転記していましたが、データ量が多く時間がかかるため、時間の短縮を目指しています。
- エクセルVBAでシート間の転記を行う際に実行時エラー1004アプリケーション定義またはオブジェクト定義のエラーが発生しています。週入力シートのD5セルから下に入力されている内容を転記シートの同じセル範囲へ転記したいのですが、現在は転記先の開始位置としてD5セルを使用しています。将来的に列の変更に対応するために変数を使用したいと考えています。以前はfor next文を使用して1行ずつ転記していましたが、データの量が多く時間がかかるため、時間短縮のための改善策を検討しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ご質問のコードをそのまま利用するのであれば、以下のように変更してください。 ws結果..Range(Cells(5, "D"), Cells(人数 + 5 - 1, "D")) =ws結果.Range(Cells(5, "D"), Cells(人数 + 5 - 1, "D")).Value ↓ ws結果.Range(ws結果.Cells(5, "D"), ws結果.Cells(人数 + 5 - 1, "D")) = wsデータ.Range(wsデータ.Cells(5, "D"), wsデータ.Cells(人数 + 5 - 1, "D")).Value ※CellやRangeオブジェクトには対象のシート(wsデータ、ws結果)を明示するようにしてください。省略した場合はアクティブシートが指定されてしまうため、思わぬ動作をする場合があります。 変数「列」にご希望の列記号を指定した場合に5行目から人数分のデータを同じ範囲でws結果で指定したシートへ値のみ複写するサンプルを載せておきます。 Sub sample1() Dim wsデータ As Worksheet Dim ws結果 As Worksheet Dim aa As Long Dim 人数 As Long Dim 列 As String Set wsデータ = ActiveWorkbook.Worksheets("週入力") Set ws結果 = ActiveWorkbook.Worksheets("転記") 列 = "D" wsデータ.Activate aa = wsデータ.Range("A" & Rows.Count).End(xlUp).Row 人数 = aa - 4 ws結果.Cells(5, 列).Resize(人数, 1) = wsデータ.Cells(5, 列).Resize(人数, 1).Value End Sub ※Rangeでセル範囲を指定すると長くなりがちなので、Resizeで選択範囲を拡張しています。また、変数の宣言はプログラムの冒頭でまとめて記述したほうが良いでしょう。
その他の回答 (3)
- tsubu-yuki
- ベストアンサー率46% (179/386)
えーと、まず・・・ 行と列の関係を整理しましょうね。 エクセルの世界では 行(縦方向:1~1048576) 列(横方向:A~XFD) ※いずれも2007以降 と呼ぶのが一般的です。 行の高さ、列の幅 と言いますよね。 ちゃんと理解しておくと、あとが楽ですよ。 さて本題。 せっかくA列の最終行を取得しているのだから、 コピー・貼り付けではダメなのですか? wsデータ.Range("D5:D" & aa).Copy ws結果.Range("D5") Application.CutCopyMode = False です。 元が数式で、それの計算結果だけを貼り付けたいなら wsデータ.Range("D5:D" & aa).Copy ws結果.Range("D5").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False くらいでしょうか。 どちらにしても、For~Nextよりはきっと早いですよ。
お礼
回答ありがとうございました。 何気なく行と列を使っていましたが 自分でコードを見返して あんまりな書き方だと気づきました。 コピーペーストも今度から使ってみたいと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
Inputが1シート、Outputが1つ別シートうを扱う場合は(それ以上の数のシートを対象にする場合はもちろん Sub test01() Set sh1 = Worksheets("週入力") Set sh2 = Workshhet("転記") ・・・ End Sub のようにobjectを最初に短い記号で定義して、 Range(セル)を式の左辺、右辺に定義して使う場合や、1セルでも(Rangeですが)指し示す・参照する場合は、RangeやCellsの記述の前に(上記の場合)Sh1.やSh2.を被せてコードを記述することを心がけてください。その1部の手抜きが原因ではないかな。 どういう場合にこれを省けるのか、(本やWEBの説明記事が詳しく書いたものが見つからないという意味で)事例はむつかしいようだが。 概略的には、2Sheet以上を使うときは必要と覚えているが。 WorkBooksでも起こることと思うが、別ブックなら、限定が必要だと気づく場合が多いし、頻度が少ないので質問に出ないのだろう。
お礼
エクセル関係でのご回答、いつも拝見いたしております。 自分での今後につながる貴重な内容、ありがとうございました。
- nan93850673
- ベストアンサー率32% (179/553)
ws結果.Range(ws結果.Cells(5, "D"), ws結果.Cells(人数 + 5 - 1, "D")) =wsデータ.Range(wsデータ.Cells(5, "D"), wsデータ.Cells(人数 + 5 - 1, "D")).Value
お礼
一番最初にお答えくださり ありがとうございました。 今度からきちんと明示して書こうとおもいます。
お礼
回答ありがとうございました。 的確な回答に加えてリサイズについても 勉強させていただき、大変助かりました。