Excel VBA質問箱 IV

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

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


4097 / 13646 ツリー ←次へ | 前へ→

【58431】For文で集計貼付 初心者 08/10/26(日) 6:36 質問[未読]
【58432】Re:For文で集計貼付 かみちゃん 08/10/26(日) 8:00 発言[未読]
【58434】Re:For文で集計貼付 初心者 08/10/26(日) 10:26 質問[未読]
【58435】Re:For文で集計貼付 かみちゃん 08/10/26(日) 10:33 発言[未読]
【58443】Re:For文で集計貼付 初心者 08/10/26(日) 13:59 質問[未読]
【58444】Re:For文で集計貼付 かみちゃん 08/10/26(日) 14:09 発言[未読]
【58445】Re:For文で集計貼付 初心者 08/10/26(日) 14:36 質問[未読]
【58448】Re:For文で集計貼付 かみちゃん 08/10/26(日) 16:04 発言[未読]
【58451】Re:For文で集計貼付 初心者 08/10/26(日) 18:51 質問[未読]
【58452】Re:For文で集計貼付 かみちゃん 08/10/26(日) 19:13 発言[未読]
【58453】Re:For文で集計貼付 初心者 08/10/26(日) 19:56 質問[未読]
【58454】Re:For文で集計貼付 かみちゃん 08/10/26(日) 20:32 発言[未読]
【58455】Re:For文で集計貼付 初心者 08/10/26(日) 21:58 お礼[未読]

【58431】For文で集計貼付
質問  初心者  - 08/10/26(日) 6:36 -

引用なし
パスワード
   VBAのFor文について、教えてください。
Sheet1のE列から3列飛ばしでBW列まである数字をコピーして、sheet2に貼り付ける処理を行うことを3から100行までFor文で実行したいのですが、
数字を取得するところでエラーしていまいます。
どうかアドバイスなどをいただきたくよろしくお願いします。


Sub データ取得貼付()

'
' Macro1 Macro
'

'
For i = 3 To 100    
       Cells(1, 1) = i
  If Cells(i, 1) <> "" Then
       Worksheets("sheet1").Activate
        Range("E3,I3,M3(省略)・・・・・,BW3").Select
'       Range("Ei,Ii,Mi(省略)・・・・・,BWi").Select
        Selection.Copy
        Sheets("sheet3").Select
        Range("G3").Select
        Selection.PasteSpecial Paste:=xlPasteAll,
          Operation:=xlNone, SkipBlanks:= _
           False, Transpose:=True
      End If
    Next
     

End Sub

【58432】Re:For文で集計貼付
発言  かみちゃん  - 08/10/26(日) 8:00 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> Sheet1のE列から3列飛ばしでBW列まである数字をコピーして、Sheet2に貼り付け
> る処理を行うことを3から100行までFor文で実行したいのですが、
> 数字を取得するところでエラーしていまいます。

どの行で、どのようなエラーになるのでしょうか?

あと、直接は関係ありませんが、
・変数の宣言
・インデントの整理
は、きちんとされたほうがいいと思います。

上記を整理して、再現できる簡単なコードとして、以下のようなコードを実行する
とエラーは出ませんでした。
☆の行は、暫定として修正追加している行です。
★は追加した行です。

なお、
  If Cells(i, 1) <> "" Then '◆
の行は、変数i が 1 のときは、マクロ開始時のアクティブシートですが、
変数i が 2以上のときは、Sheet3 のセルがアクティブになっていますが大丈夫
でしょうか?

Sub データ取得貼付2()
 Dim i As Integer '★
 
 For i = 3 To 100
  MsgBox Cells(1, 1).Address(, , , True) '☆
  Cells(1, 1) = i
  If Cells(i, 1) <> "" Then '◆
   Worksheets("Sheet1").Activate
   Range("E3,I3").Select '☆
'   Range("E3,I3,M3(省略)・・・・・,BW3").Select
   '       Range("Ei,Ii,Mi(省略)・・・・・,BWi").Select
   Selection.Copy
   Sheets("Sheet3").Select
   Range("G3").Select
'   ↓xlPasteAll, の後に △_ が 抜けている?(△は半角スペース)
   Selection.PasteSpecial Paste:=xlPasteAll, _
    Operation:=xlNone, SkipBlanks:= _
     False, Transpose:=True
  End If
 Next
End Sub

【58434】Re:For文で集計貼付
質問  初心者  - 08/10/26(日) 10:26 -

引用なし
パスワード
   ▼かみちゃん さん、はじめまして 
>>どの行で、どのようなエラーになるのでしょうか?
Range("E3,I3,M3(省略)・・・・・,BW3").Select
↑この行で「実行時エラー1004 Rangeクラスのselectメソッドが失敗しました」
とでます。

>>あと、直接は関係ありませんが、
>>・変数の宣言
>>・インデントの整理
>>は、きちんとされたほうがいいと思います。
アドバイスありがとうございます。今後、気をつけます。

>>なお、
>>  If Cells(i, 1) <> "" Then '◆
>>の行は、変数i が 1 のときは、マクロ開始時のアクティブシートですが、
>>変数i が 2以上のときは、Sheet3 のセルがアクティブになっていますが大丈夫
>>でしょうか?
ご指摘のとおり、E3,I3をsheet3に貼り付けたあとにsheet3がアクティブになり、処理が進みません。
どのように修正すれば、またaheet1のデータを取得し、sheet3に貼り付けるという処理を繰り返してくれるのでうしょうか?お教えください。

>Sub データ取得貼付2()
> Dim i As Integer '★
> 
> For i = 3 To 100
>  MsgBox Cells(1, 1).Address(, , , True) '☆
>  Cells(1, 1) = i
>  If Cells(i, 1) <> "" Then '◆
>   Worksheets("Sheet1").Activate
>   Range("E3,I3").Select '☆
>'   Range("E3,I3,M3(省略)・・・・・,BW3").Select
>   '       Range("Ei,Ii,Mi(省略)・・・・・,BWi").Select
>   Selection.Copy
>   Sheets("Sheet3").Select
>   Range("G3").Select
>'   ↓xlPasteAll, の後に △_ が 抜けている?(△は半角スペース)
抜けておりました。
>   Selection.PasteSpecial Paste:=xlPasteAll, _
>    Operation:=xlNone, SkipBlanks:= _
>     False, Transpose:=True
>  End If
> Next
>End Sub

よろしくお願いします。

【58435】Re:For文で集計貼付
発言  かみちゃん  - 08/10/26(日) 10:33 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>>どの行で、どのようなエラーになるのでしょうか?
>Range("E3,I3,M3(省略)・・・・・,BW3").Select
>↑この行で「実行時エラー1004 Rangeクラスのselectメソッドが失敗しました」
>とでます。

たとえば、
Range("E3,I3").Select
というような簡単なコードにしても同様のエラーになりますか?
(省略)・・・・・
の内容に問題があるような感じがします。

>>>なお、
>>>  If Cells(i, 1) <> "" Then '◆
>>>の行は、変数i が 1 のときは、マクロ開始時のアクティブシートですが、
>>>変数i が 2以上のときは、Sheet3 のセルがアクティブになっていますが大丈夫
>>>でしょうか?
>ご指摘のとおり、E3,I3をsheet3に貼り付けたあとにsheet3がアクティブになり、処理が進みません。
>どのように修正すれば、またaheet1のデータを取得し、sheet3に貼り付けるという処理を繰り返してくれるのでうしょうか?お教えください。

とりあえずは、
For i = 3 To 100
 Worksheets("Sheet1").Activate
 Cells(1, 1) = i
としてみてください。

もっと効率のいい書き方(シートやセルをアクティブにしない)はありますが、
それは、もう少し先でいいと思います。

【58443】Re:For文で集計貼付
質問  初心者  - 08/10/26(日) 13:59 -

引用なし
パスワード
   かみちゃん さん 、こんにちは。

>>たとえば、
>>Range("E3,I3").Select
>>というような簡単なコードにしても同様のエラーになりますか?
>>(省略)・・・・・
>>の内容に問題があるような感じがします。
エラーはなくなりました。

>とりあえずは、
>For i = 3 To 100
> Worksheets("Sheet1").Activate
> Cells(1, 1) = i
>としてみてください。
マクロは正常終了しますが、sheet1のE3,I3をコピーして、sheet3に貼り付けを繰り返しているだけのようです。
実現したいこと(3行処理→4行処理・・・100行処理)はできておりません。


Sub データ取得貼付2()
 Dim i As Integer '★

' For i = 3 To 100
'  MsgBox Cells(1, 1).Address(, , , True) '☆ 
 ここを有効にすると、Microsoft Excelのメッセージがポップアップしてきて、 [sheet1]sheet3!$A$1と表示され、タスクを終了する必要になります。
'  Cells(1, 1) = i
 For i = 3 To 100
   Worksheets("20u06_1stTD").Activate
   Cells(1, 1) = i

  If Cells(i, 1) <> "" Then '◆
'   Worksheets("sheet1").Activate
  
   Range("E3,I3").Select '☆
'   Range("E3,I3,M3(省略)・・・・・,BW3").Select
   '       Range("Ei,Ii,Mi(省略)・・・・・,BWi").Select
   Selection.Copy
   Sheets("sheet3").Select
   Range("G5").Select
'   ↓xlPasteAll, の後に △_ が 抜けている?(△は半角スペース)
   Selection.PasteSpecial Paste:=xlPasteAll, _
    Operation:=xlNone, SkipBlanks:= _
     False, Transpose:=True
  End If
 Next
End Sub

【58444】Re:For文で集計貼付
発言  かみちゃん  - 08/10/26(日) 14:09 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>とりあえずは、
>>For i = 3 To 100
>> Worksheets("Sheet1").Activate
>> Cells(1, 1) = i
>>としてみてください。
>マクロは正常終了しますが、sheet1のE3,I3をコピーして、sheet3に貼り付けを繰り返しているだけのようです。
>実現したいこと(3行処理→4行処理・・・100行処理)はできておりません。

そういう説明がないのと、そういうコードにしているからだと思います。

>実現したいこと(3行処理→4行処理・・・100行処理)

本当は、何がしたいのか、今ひとつよくわからないのですが、

>   Range("E3,I3").Select '☆

の部分は、

 Intersect(Rows(i), Range("E3,I3").EntireColumn).Select

とすればいいかと思います。

ただし、

>   Sheets("sheet3").Select
>   Range("G5").Select

というコードにしている以上、
Sheet3のG5セルに、どんどん上書きで貼り付けられると思うのですが、いいのでしょうか?
もしかして、

   Range("G" & i + 2).Select

としていのでしょうか?

> '  MsgBox Cells(1, 1).Address(, , , True) '☆ 
> ここを有効にすると、Microsoft Excelのメッセージがポップアップしてきて、 [sheet1]sheet3!$A$1と表示され、タスクを終了する必要になります。

タスクを終了という意味がわかりませんが、
現在どのブックのどのシートのどのセルを参照しているのかを確認していただくための
ものです。

状況がきちんと理解できれば、不要となります。

【58445】Re:For文で集計貼付
質問  初心者  - 08/10/26(日) 14:36 -

引用なし
パスワード
   ▼かみちゃん さん、こんにちは。
うまく自分の実現したいことを伝えられず、すいません。
>>ただし、
>>
>>>   Sheets("sheet3").Select
>>>   Range("G5").Select
>>
>>というコードにしている以上、
>>Sheet3のG5セルに、どんどん上書きで貼り付けられると思うのですが、いいので>しょうか?
そのとおりに処理されました。

>>もしかして、
>>
>>   Range("G" & i + 2).Select
>>
>>としていのでしょうか?
貼り付けをG列・I列・K列と処理したいです。
どうかよろしくお願いします。

【58448】Re:For文で集計貼付
発言  かみちゃん  - 08/10/26(日) 16:04 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> うまく自分の実現したいことを伝えられず

最初は、

> Sheet1のE列から3列飛ばしでBW列まである数字をコピーして、Sheet2に貼り付ける処理
> を行うことを3から100行までFor文で実行したい

ということなのですが、
Range("E3,I3,M3(省略)・・・・・,BW3").Select
となっていたり、
Sheets("sheet3").Select
となっていたり、

> 貼り付けをG列・I列・K列と処理したい

ともおっしゃっていて、初心者さんのコードをできるだけ崩さずに修正する方法を考えて
いたのですが、時間もなくなってきたので私なりの方法を提案したいと思います。

Sub Sample()
 Dim i As Long
 Dim j As Long
 
 For i = 3 To 100
  Sheets("Sheet1").Cells(1, 1).Value = i
  If Sheets("Sheet1").Cells(i, 1).Value <> "" Then
   For j = 5 To 75 Step 4
    '貼り付けをG列・I列・K列と処理する
    Sheets("Sheet1").Cells(i, j).Copy Sheets("Sheet2").Cells(i, j + 2 + Int((j - 5) / -4) * 2)
   Next
  End If
 Next
 MsgBox "終了"
End Sub

   For j = 5 To 75 Step 4
    '貼り付けをG列・I列・K列と処理する
    Sheets("Sheet1").Cells(i, j).Copy Sheets("Sheet2").Cells(i, j + 2 + Int((j - 5) / -4) * 2)
   Next

のあたりは、変数をもうひとつ用意して、処理したほうがわかりやすいかもしれませんね。

 Dim k As Long

   k = 7
   For j = 5 To 75 Step 4
    '貼り付けをG列・I列・K列と処理する
    Sheets("Sheet1").Cells(i, j).Copy Sheets("Sheet2").Cells(i, k)
    k = k + 2
   Next

【58451】Re:For文で集計貼付
質問  初心者  - 08/10/26(日) 18:51 -

引用なし
パスワード
   かみちゃん さん ご迷惑をおかけしております。

マクロの提供いただき、感謝しております。
これまた、私の説明が悪いので実現したいことと処理が一致していませんでした。

提供いただいたマクロ処理
・コピー元:Sheet1のG列・I列・K列にある数字をコピー。
・貼り付け:Sheet2へ貼り付けをはG列・I列・K列と貼り付け。

実現したい処理
・コピーはSheet1のE列から3列飛ばしでBW列まである数字をコピーする。
 処理行は3行目から100行目まで。
・Sheet2へ貼り付けをはG列・I列・K列と処理したい

勉強不足で不愉快にさせたことは謝りますので、修正したマクロを提供いただければと思います。

【58452】Re:For文で集計貼付
発言  かみちゃん E-MAIL  - 08/10/26(日) 19:13 -

引用なし
パスワード
   こんにちは。かみちゃんです。

>実現したい処理
>・コピーはSheet1のE列から3列飛ばしでBW列まである数字をコピーする。
> 処理行は3行目から100行目まで。
>・Sheet2へ貼り付けをはG列・I列・K列と処理したい

よくわからないので、シートレイアウトを整理してみました。

【Sheet1】
  A   B  C  D  E  F  G  H  I  J  K  L  M  N
1
2
3 あああ       15       27       39
4 いいい       20       36       52
5

というシートで、実行すると、以下のように出力されればいいのですよね?

【Sheet2】
  A  B  C  D  E  F  G  H  I  J  K  L
1
2
3             15   27   39
4             20   36   52
5

私が[58448]で提示した
Sub Sample()
で処理できませんでしたか?

>勉強不足で不愉快にさせたことは謝ります

不愉快な思いや、迷惑を被ったりはしていませんので、その辺はお気遣いなく。
ただ、初心者さんがしたいことを、私がほとんど理解できていないような感じがしています。

【58453】Re:For文で集計貼付
質問  初心者  - 08/10/26(日) 19:56 -

引用なし
パスワード
   かみちゃん さん、こんばんは。
>よくわからないので、シートレイアウトを整理してみました。
>
>【Sheet1】
>  A   B  C  D  E  F  G  H  I  J  K  L  M  N
>1
>2
>3 あああ       15       27       39
>4 いいい       20       36       52
>5
>
>というシートで、実行すると、以下のように出力されればいいのですよね?
はい。そうです。
>
>【Sheet2】
>  A  B  C  D  E  F  G  H  I  J  K  L
>1
>2
>3             15   27   39
>4             20   36   52
>5
>
>私が[58448]で提示した
>Sub Sample()
>で処理できませんでしたか?
>
すいません。処理できておりました。大変助かります。

まだ、for文の中身が理解できていないので処理内容について、教えてください!

たとえば、以下のように1個飛ばしだと、Step 4を単純にStep 2にしてもダメでした?よろしくお願いします。

・抜粋
 For j = 5 To 75 Step 4
    '貼り付けをG列・I列・K列と処理する
    Sheets("Sheet1").Cells(i, j).Copy Sheets("Sheet2").Cells(i, j + 2 + Int((j - 5) / -4) * 2)
   Next


【Sheet1】
  A   B  C  D  E  F  G  H  I  J  K  L  M  N
1
2
3 あああ       15 10 1  13 27 19 1  11 39
4 いいい       20 22 2  45 36  0 3  41 47   
5

というシートで、実行すると、以下のように出力されればいいのですよね?

【Sheet2】
  A  B  C  D  E  F  G  H  I  J  K  L  M
1
2
3             15   1    27    1
4             20   2    36    3
5

【58454】Re:For文で集計貼付
発言  かみちゃん E-MAIL  - 08/10/26(日) 20:32 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>たとえば、以下のように1個飛ばしだと、Step 4を単純にStep 2にしてもダメでした?

変数k を追加して、以下のようにしたほうがわかりやすいかもしれません。

Sub Sample()
 Dim i As Long
 Dim j As Long
 Dim k As Long
' Const X As Integer = 3 '飛ぶ列の数(3列飛ばし)
 Const X As Integer = 1 '飛ぶ列の数(1列飛ばし)

 For i = 3 To 100
  Sheets("Sheet1").Cells(1, 1).Value = i
  If Sheets("Sheet1").Cells(i, 1).Value <> "" Then
   k = 7
   For j = 5 To 75 Step X + 1
    '貼り付けをG列・I列・K列と処理する
    Sheets("Sheet1").Cells(i, j).Copy Sheets("Sheet2").Cells(i, k)
    k = k + 2
   Next
  End If
 Next
 MsgBox "終了"
End Sub

【58455】Re:For文で集計貼付
お礼  初心者  - 08/10/26(日) 21:58 -

引用なし
パスワード
   かみちゃん さん、こんばんは。
>こんにちは。かみちゃん です。
>
>>たとえば、以下のように1個飛ばしだと、Step 4を単純にStep 2にしてもダメでした?
>
>変数k を追加して、以下のようにしたほうがわかりやすいかもしれません。

なるほどです。処理できました。
この度本当にありがとうございました。

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