Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


111 / 13645 ツリー ←次へ | 前へ→

【81927】シート間のデータコピーでエラー ackkn 22/1/26(水) 14:35 質問[未読]
【81928】Re:シート間のデータコピーでエラー マナ 22/1/26(水) 16:24 発言[未読]
【81929】Re:シート間のデータコピーでエラー ackkn 22/1/26(水) 16:47 回答[未読]
【81930】Re:シート間のデータコピーでエラー マナ 22/1/26(水) 18:37 発言[未読]
【81933】Re:シート間のデータコピーでエラー ackkn 22/1/26(水) 22:55 回答[未読]
【81931】Re:シート間のデータコピーでエラー マナ 22/1/26(水) 21:50 発言[未読]
【81932】Re:シート間のデータコピーでエラー ackkn 22/1/26(水) 22:35 回答[未読]
【81934】Re:シート間のデータコピーでエラー マナ 22/1/27(木) 16:20 発言[未読]
【81935】Re:シート間のデータコピーでエラー ackkn 22/1/27(木) 17:31 回答[未読]
【81937】Re:シート間のデータコピーでエラー ackkn 22/1/28(金) 15:00 回答[未読]
【81938】Re:シート間のデータコピーでエラー マナ 22/1/28(金) 19:54 発言[未読]
【81940】Re:シート間のデータコピーでエラー ackkn 22/1/28(金) 22:35 回答[未読]
【81941】Re:シート間のデータコピーでエラー ackkn 22/1/29(土) 10:45 回答[未読]
【81942】Re:シート間のデータコピーでエラー マナ 22/1/29(土) 14:52 発言[未読]
【81943】Re:シート間のデータコピーでエラー ackkn 22/1/29(土) 15:37 回答[未読]
【81944】Re:シート間のデータコピーでエラー ackkn 22/1/29(土) 16:45 回答[未読]
【81945】Re:シート間のデータコピーでエラー マナ 22/1/29(土) 17:44 発言[未読]
【81949】Re:シート間のデータコピーでエラー ackkn 22/1/30(日) 11:00 回答[未読]
【81950】Re:シート間のデータコピーでエラー マナ 22/1/30(日) 11:58 発言[未読]
【81951】Re:シート間のデータコピーでエラー ackkn 22/1/30(日) 12:28 お礼[未読]

【81927】シート間のデータコピーでエラー
質問  ackkn  - 22/1/26(水) 14:35 -

引用なし
パスワード
   また行き詰まりました。
下表をセンター納品日でシートを分けたくて、下記のコードを考えたのですが、

   A   B  C   D   E    F    G   H  I  J  K  L  M   N   O
1
2 センター納品日 得意先 センター 商品CD 商品名  数量 総ケース ケース バラ 積数 PL数 端数 ケース重量 総重量
3 12月7日 (火) A社  Aセンター  A  商品A  2,800  70  70  0  54 1.3  16   10  700
4 12月7日 (火) A社  Bセンター  A  商品A 12,480  312 312  0  54 5.8  42   10 3,120
5 12月7日 (火) A社  Cセンター  A  商品A  8,240  206 206  0  54 3.8  44   10 2,060
6 12月8日 (水) B社  Dセンター  B  商品B  2,356  59  58 36  54 1.1  5   10  590
7 12月9日 (木) C社  Eセンター  C  商品C   30   1  0 30  40 0.0  1   10   10
8 12月10日(金) D社  Fセンター  A  商品A  1,600  40  40  0  54 0.8  40   10  400

r1.Row が 3 で >>>行で下のエラーになります。

実行時エラー '1004':
アプリケーション定義またはオブジェクト定義のエラーです。

何が悪いのでしょうか? ご教示ください。
尚、Excel のバージョンは 2019 です。

Sub 処理()
  Dim ws, ws2, wsk As Worksheet
  Dim r1 As Range
  Dim i As Long
  Dim Mvc As Long
  Dim Rmax As Long
   
  Set ws = ActiveWorkbook.Worksheets("Sheet1")
  Set ws2 = ActiveWorkbook.Worksheets("Sheet2")
    
  ws.Activate
  Rmax = ws.Cells(Rows.Count, 3).End(xlUp).Row  'C列最下行
  Range("A2:P" & Rmax).Select
  With ws.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=Range("A3:A" & Rmax), SortOn:=xlSortOnValues, _
      Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add2 Key:=Range("C3:C" & Rmax), SortOn:=xlSortOnValues, _
      Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add2 Key:=Range("D3:D" & Rmax), SortOn:=xlSortOnValues, _
      Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range("A2:O" & Rmax)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .Apply
  End With
  Range("A2").Select

'--- データの移動 (日付9日未満のデータを「Sheet2」へ)
  Rmax = ws.Cells(Rows.Count, 1).End(xlUp).Row  'A列最下行を取得
  Mvc = 0
  For Each r1 In Range("A3:A" & Rmax)
    If Day(r1) < 9 Then
      Mvc = Mvc + 1
>>>     ws.Range("A3").Resize(r1.Row - 3, 14).Copy ws2.Range("A3")
    End If
  Next
  If Mvc <> 0 Then
    Range("A" & r1.Row + 1 & ":O" & Rmax).Copy Range("A3")
  End If
 
End Sub

【81928】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/26(水) 16:24 -

引用なし
パスワード
   ▼ackkn さん:

>アプリケーション定義またはオブジェクト定義のエラーです。
>何が悪いのでしょうか? ご教示ください。

Offset と Resize をごっちゃにしていませんか。
Resizeの引数は、1以上でないとエラーです。
0にResizeできません。

【81929】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/26(水) 16:47 -

引用なし
パスワード
   マナ 様

早速のレス、ありがとうございます。

そうなんですね、
じゃー今回のように同一行で横にリサイズは出来ないのですか?

アホな疑問ならごめんなさい。

【81930】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/26(水) 18:37 -

引用なし
パスワード
   ▼ackkn さん:

>じゃー今回のように同一行で横にリサイズは出来ないのですか?

ステップ実行で確認してください

Sub test()
  Range("A1").Select
  Selection.Resize(1, 3).Select
  Selection.Resize(2).Select
  Selection.Resize(, 5).Select
  Selection.Resize(1, 1).Select
End Sub

【81931】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/26(水) 21:50 -

引用なし
パスワード
   ▼ackkn さん:
^
>下表をセンター納品日でシートを分けたくて、下記のコードを考えたのですが、

エラーの件は別にして、

こういうのは、
1)オートフィルタで抽出
2)抽出された行を転記
3)抽出された行を削除
4)フィルタ解除
が簡単ですよ。

【81932】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/26(水) 22:35 -

引用なし
パスワード
   ▼マナ さん:

>>下表をセンター納品日でシートを分けたくて、下記のコードを考えたのですが、
>
>エラーの件は別にして、
>
>こういうのは、
>1)オートフィルタで抽出
>2)抽出された行を転記
>3)抽出された行を削除
>4)フィルタ解除
>が簡単ですよ。

ありがとうございます。

お礼ついでに、甘えていいですか。
コード例をお見せいただきたいです。

よろしくお願いいたします。

【81933】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/26(水) 22:55 -

引用なし
パスワード
   ▼マナ さん

ありがとうございます。

愚問でした。
お手数をおかけしております。

よく確認しました。

Resize(1, 3).Select でも Resize(, 5).Select

ゼロでなければ、1 でも 略しても同一行なんですね。
改めて確認させていただきました。

情けない!

【81934】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/27(木) 16:20 -

引用なし
パスワード
   ▼ackkn さん:

Sub test()
  Dim r1 As Range
  Dim r2 As Range
  Dim d As Date
  
  Set r1 = Worksheets("Sheet1").Range("A2").CurrentRegion
  Set r2 = Worksheets("Sheet2").Range("A2")
  r2.CurrentRegion.ClearContents
  
  d = r1(2, 1).Value
  r1.AutoFilter 1, "<" & CLng(DateSerial(Year(d), Month(d), 11))
  r1.Copy r2
  
  r1.Offset(1).Delete xlShiftUp
  r1.AutoFilter
  
End Sub

【81935】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/27(木) 17:31 -

引用なし
パスワード
   ▼マナ さん:

ありがとうございます。

しかし、めっちゃシンプルですね!
帰って確認させていただき、ご報告いたします。

あれから、自分でもオートフィルタを調べてコーディングしていたのですが、
Sheet1(=Sheet2)ですが、実はD列が非表示であるのです。

この場合、
コピーもA列からC列とE列からP列に分けて行う必要がありますよね?

【81937】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/28(金) 15:00 -

引用なし
パスワード
   ▼マナ さん:

テストに時間を取られてしまい、遅くなりましたが、オートフィルタの便利さを
実感しました。 ありがとうございました。

ただ、下記のコードになったのですが、最初のマナさんのすっきりしたコードから
かなり野暮ったくなった気がするのは気のせいでしょうか?


 Set ws = ActiveWorkbook.Worksheets("Sheet1")
 Set ws2 = ActiveWorkbook.Worksheets("Sheet2")

 Set r1 = ws.Range("A2").CurrentRegion
 Set r2 = ws2.Range("A2")
 r2.CurrentRegion.Offset(1, 0).ClearContents
  
 d = r1(3, 1).Value
 r1.AutoFilter 1, "<" & CLng(DateSerial(Year(d), Month(d), 13))
 If WorksheetFunction.Subtotal(3, Range("A:A")) > 1 Then
   Rmax = Cells(Rows.Count, 3).End(xlUp).Row
   Range("A2").Resize(Rmax - 2, 3).Offset(1, 0).Copy
   ws2.Range("A" & ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1). _
   PasteSpecial (xlPasteAll)
   Range("E2").Resize(Rmax - 2, 12).Offset(1, 0).Copy
   ws2.Range("E" & ws2.Cells(Rows.Count, 5).End(xlUp).Row + 1). _
   PasteSpecial (xlPasteAll)

   Range("A2").Resize(Rmax - 2, 16).Offset(1, 0).Delete
 End If
 r1.AutoFilter

【81938】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/28(金) 19:54 -

引用なし
パスワード
   ▼ackkn さん:

> If WorksheetFunction.Subtotal(3, Range("A:A")) > 1 Then
>   Rmax = Cells(Rows.Count, 3).End(xlUp).Row
>   Range("A2").Resize(Rmax - 2, 3).Offset(1, 0).Copy

オートフィルタの結果は、データ範囲全体をコピーしても
可視行しかコピーされません。
わざわざ、Rmax を使う必要ありません。
手作業で確認してみるとよいです。

これでも同じということです。
 r1.Resize(, 3).Offset(1, 0).Copy

> Sheet1(=Sheet2)ですが、実はD列が非表示であるのです。
> この場合、
> コピーもA列からC列とE列からP列に分けて行う必要がありますよね?

Sheet1とSheet2のD列には、何かデータがあるのでしょうか。

【81940】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/28(金) 22:35 -

引用なし
パスワード
   ▼マナ さん:

ありがとうございます。

>手作業で確認してみるとよいです。
>これでも同じということです。
> r1.Resize(, 3).Offset(1, 0).Copy

可視行しかコピーされないのは調べたんですが、と言うことは、そうですよね。
今一度、ステップで確認します。

>Sheet1とSheet2のD列には、何かデータがあるのでしょうか。
実は、ソート目的でA列とE列を&しています。 アホですよね。

【81941】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/29(土) 10:45 -

引用なし
パスワード
   ▼マナ さん:

確認しました。
微妙に動作が違います。 下記コードの上3行がC列までのコピーですが、
マナさん仰るとおり、Rmaxがなくても行けましたが、選択範囲の下に1行空白行が
選択されます。

また、その下のコード3行がE列以降のP列までをコピーしたいのですが、
この r1.Resize(, 16).Offset(1, 0).Copy 部分の記述の仕方が分かりません。

しかし、上記同様、選択範囲の下に1行空白行が選択されます。

よろしくご教示下さい。

r1.Resize(, 3).Offset(1, 0).Copy
ws2.Range("A" & ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1). _
PasteSpecial (xlPasteAll)

r1.Resize(, 16).Offset(1, 0).Copy
ws2.Range("E" & ws2.Cells(Rows.Count, 5).End(xlUp).Row + 1). _
PasteSpecial (xlPasteAll)

【81942】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/29(土) 14:52 -

引用なし
パスワード
   ▼ackkn さん:

>選択範囲の下に1行空白行が選択されます。

その通りです。
空白行を含めたくない場合は、
Intersectメソッドが使うとよいです。
ネットで調べ、トライしてみてください。

ですが、空白行が余分にあると何か問題ですか。
動作の違いを理解して使うことが前提ですが
結果が同じであれば、どちらでもよい
と考えることもできませんか。
さらに言えば、見出し行も含めてコピペでも
同じ結果ではありませんか。
その場合、Offsetしないという意味です。
こんな感じです。
r1.Columns("A:C").Copy
とか
r1.Columns("E:P").Copy

メリットは、抽出0件の場合が考慮不要なため
コードがシンプルになります。


また、Sheet2に空のD列の目的がわかりませんが、
D列データももコピーしても問題ないなら
ロジックを変更するとよいかもしれません。

1)Sheet1をSheet2に丸ごとコピー
2)Sheet1で、<13日をフィルタ抽出・削除
3)Sheet1のフィルタ解除
4)Sheet2で、>12日をフィルタ抽出・削除
5)Sheet2のフィルタ解除
6)必要ならSheet2のD列データ削除

【81943】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/29(土) 15:37 -

引用なし
パスワード
   ▼マナ さん:

ありがとうございます。
非常に勉強になります。

>空白行を含めたくない場合は、Intersectメソッドが使うとよいです。
空白は含めたくないので、Intersectメソッドにトライします。

それと、Sheet1、Sheet2共に次の工程が、先日の所定フォームへの流し込みです。
よって、空白行は含めたくありません。
で、またヒントを2ついただきました。

1つは、列でコピーする。

2つ目は、シート丸ごとコピーして、それぞれで不要データを削除する。
この発想には驚きました。 もっと柔軟な発想を心掛けます。

この3つの案にトライして、また質問させてください。
よろしくお願いします。

【81944】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/29(土) 16:45 -

引用なし
パスワード
   ▼マナ さん:

Intersectメソッドにトライしました。
上手くいきましたが、ちょっと冗長でしょうか?

Rmax = Cells(Rows.Count, 3).End(xlUp).Row
Intersect(Rows("3:" & Rmax), Columns("A:C")).Copy
ws2.Range("A" & ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1). _
PasteSpecial (xlPasteAll)

Intersect(Rows("3:" & Rmax), Columns("E:P")).Copy
ws2.Range("E" & ws2.Cells(Rows.Count, 5).End(xlUp).Row + 1). _
PasteSpecial (xlPasteAll)

【81945】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/29(土) 17:44 -

引用なし
パスワード
   ▼ackkn さん:

>それと、Sheet1、Sheet2共に次の工程が、先日の所定フォームへの流し込みです。
>よって、空白行は含めたくありません。

誤解があるといけないので、念のため確認ですが
空白行が途中に挿入されることはないですよ。
一番下に貼り付けられるだけです。
もともと空白の行に、空白行を上書きするだけなので
結果だけみると区別つかないと思いますが?

【81949】Re:シート間のデータコピーでエラー
回答  ackkn  - 22/1/30(日) 11:00 -

引用なし
パスワード
   ▼マナ さん:

>空白行が途中に挿入されることはないですよ。
>一番下に貼り付けられるだけです。
>もともと空白の行に、空白行を上書きするだけなので
>結果だけみると区別つかないと思いますが?

マナさんらしくないと思います。
「なればいい」、自分だけのツールでも私はしません。
技術も無いくせにと思われても、人の力を借りてでも
思いを通します。 これは性分でしょう。

今回は、集計表も印刷して他人が使いますし、その後の
スケジュール表も同様です。
下の1行でも、罫線も消えますし。

【81950】Re:シート間のデータコピーでエラー
発言  マナ  - 22/1/30(日) 11:58 -

引用なし
パスワード
   ▼ackkn さん:

>下の1行でも、罫線も消えますし

そのように、具体的に何が問題なのか
説明していただけると助かります。

こちらとしては、提示されたコードを見で
{ちょっと冗長」以前の話として
フィルタ後のコピー動作について
少し誤解があるように惧しました。

お互いに嫌な思いをするのも馬鹿らしいですよね。
わたしからは、これで終わりにさせてください。

現在、この掲示板を見ている回答者は
残念ながら、ほとんどいない気がします。
他で再質問するほうがよいかもしれません。

【81951】Re:シート間のデータコピーでエラー
お礼  ackkn  - 22/1/30(日) 12:28 -

引用なし
パスワード
   ▼マナ さん:

>わたしからは、これで終わりにさせてください。
今回は、本当に色々な考え方をお教えいただき、ありがとうございました。

>
>現在、この掲示板を見ている回答者は
>残念ながら、ほとんどいない気がします。
>他で再質問するほうがよいかもしれません。
本当ですか!!
昔からお世話になった方々も、どこへ行かれたのでしょうか?
確かに、ここへの投稿、投稿のたびにエラーが出て、??と思って
いましたが、そうなんですね。

どこに行けばいいのでしょうか?

111 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free