こんにちは。以前こちらで横並びのデータを縦並びにしたいという質問に、VBAで解決して下さいました。
あの後順調にきていましたが、最近マクロを実行すると終わるまで15分ほどかかってしまいます。
以前教えていただいたコードはこちらです。
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
'//E列で「在庫表」Sheetの最終行取得★
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
'//「在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去
If lastRow > 1 Then
Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎★
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
cnt = cnt + 1
'//最初のデータ行のみ「仕入表」Sheetの日付をD列に表示★
If j = 5 Then
.Cells(cnt, "D") = wS.Cells(i, "A")
End If
.Cells(cnt, "E") = wS.Cells(i, "B") '//B列に「コード」を表示
.Cells(cnt, "F") = wS.Cells(i, "C") '//F列に「商品名」を表示
.Cells(cnt, "G") = wS.Cells(i, "D") '//G列に「下代」を表示
.Cells(cnt, "H") = wS.Cells(i, j) '//H列に「色」を表示
.Cells(cnt, "I") = wS.Cells(i, j + 1) '//I列に「数」を表示
End If
Next j
Next i
'//最後にD列の表示形式(日付)を「在庫表」SheetのA3セルの書式に設定★
.Range("D:D").NumberFormatLocal = wS.Range("A3").NumberFormatLocal
End With
End Sub '//この行まで
補足ですが、仕入表に入力した情報を在庫表に転記させたいという質問でした。
終わりの行から続きを入力する形でよいのですが、”在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去”という処理が遅くさせてるということはありますか?
データが何千行にもなっています。
解決策があれば教えていただきたいです。よろしくお願いします。
No.7
- 回答日時:
とりあえずですが
先ほどの
Application.ScreenUpdating = False
と
Application.ScreenUpdating = True
の位置に
Application.Calculation = xlCalculationManual
と
Application.Calculation = xlCalculationAutomatic
を入れるとどうなります?
(再計算を止めるコードです。)
No.4
- 回答日時:
高速化を意識して作り直したほうがよいかと。
前回の質問が判らないので、そのURLを提示していただけますか。もしくは、前回の質問の内容をご提示ください。
また、性能に影響するので、データ量に関する現在の情報を提示ください。
(最大、何行、何列あるかというような情報です)
No.3
- 回答日時:
失礼しました。
あまり関係ありませんでしたね。
元のデータはE列から横に色と数が並んでいるということですか?
このデータが何列目まであるかは可変?
平均して何列くらいあるのでしょう?
No.2
- 回答日時:
これを毎回はかなり時間のロスでは?
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎
wS.Cells(Rows.Count, "A").End(xlUp).Row
も
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
のようにできませんか?
こちらは、1回しか処理していないので、それほど関係ありませんが、
wS.Cells(i, Columns.Count).End(xlToLeft).Column
は
毎回各行で行うようになっています。
各行で変わる値なのでしょうか?
変わらないようであれば、上記のように1回だけの処理にした方が良いでしょう。
No.1
- 回答日時:
コードの中身は読み取っていませんが、消去(ClearContents)で時間がかかることはないと思います。
見たところ動作中の画面を非表示にしていないようですのでまずはそこから。
最初の方、Dim の宣言の次にでも
Application.ScreenUpdating = False
を入れ、
最後の End Sub の前に
Application.ScreenUpdating = True
を入れて下さい。
これでVBA動作中の画面を非表示にします。
あ、
Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
のところ、"在庫表"シートでよければ
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
にして下さいね。
「.」が抜けてます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
「段」と「行」の違いがよくわ...
-
VBAで結合セルを転記する法を教...
-
データシートビューのタイトル...
-
LEFT関数とIF関数の組み合わせ...
-
エクセルで住所を県と市・郡と...
-
VBA 指定した列にある日時デー...
-
エクセルで複数列の検索をマク...
-
えABのある列って
-
VBAで別ブックの列を検索し、該...
-
エクセルマクロの組み方
-
エクセルのシートの大きさを変える
-
マクロ教えてください
-
エクセルマクロでオートフィル...
-
エクセルマクロ、アウトライン...
-
エクセルVBAでデータ最終行取得...
-
Accessのレポートで繰り返し表...
-
【Excel VBA】条件を満たすデー...
-
最終行に合計(最終行が列によ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
「段」と「行」の違いがよくわ...
-
LEFT関数とIF関数の組み合わせ...
-
VBA 指定した列にある日時デー...
-
CSVファイルの「0落ち」にVBA
-
エクセルで複数列の検索をマク...
-
Excelの行数、列数を増やしたい...
-
エクセルマクロの組み方
-
エクセルマクロPrivate Subを複...
-
リストからデータを紐付けしたい
-
エクセルのソートで、数字より...
-
エクセルで住所を県と市・郡と...
-
VBAで別ブックの列を検索し、該...
-
Excel文字列一括変換
-
VBA
-
エクセル 重複 隣の列 一番...
-
列方向、行方向の定義
-
Alt+Shift+↑を一括で行うには、...
-
VBAで結合セルを転記する法を教...
おすすめ情報
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Application.ScreenUpdating = False
・
・
・
End With
Application.ScreenUpdating = True
End Sub '//この行まで
入れ方はこちらであってますか?
これと.Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
を試しましたが変わりませんでした><
ありがとうございます。
https://oshiete.goo.ne.jp/qa/8980328.html
以前の質問です。取り急ぎこちらを張り付けします。よろしくお願いします。
ありがとうございます。
元データはA~X列までの大体1000行程度です。
実行先は3000行程度までなります。列はD~Iまでです。
在庫表のタブには数式は入ってませんが、元データの仕入表タブには計算式がたくさんはいってますし、同じファイルの他のタブにも沢山計算式が入ってます・。。
それが原因でしょうか・・・
皆さん色々なアドバイスありがとうございます!!
とりあえず7番さんと9番さんのを実行したら一瞬でマクロが実行されました!!!!!
ありがとうございます!!!!!!!!!!!!!!
ですが、実行の後に、「実行時エラー’13 型が一致しません」
と出てきました。これは何でしょうか・・・無視しても大丈夫ですか?
ありがとうございます。
教えて下ったコードを追加したらマクロが実行できずにエラーになってしまいました。。
たいへん恐れ入りますが、最初からコードを書いていただくことはできますか・・・?
エラー13の表示が出たときにデバック?というボタンを押したらVBAのコードで以下の部分が黄色で色付けされていました。
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
本当にありがとうございます。
時間をかけてくださって感謝してます。
教えていただいたコードをペーストして実行したら、「コンパイルエラー NEXTに対するFORがありません」とでました。
OKを押したらVBAが出てきて、
Sub Sample4() '//この行から
この部分が黄色になり、
Next j
にカーソルが入ってます。