Excel VBA質問箱 IV

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

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


7726 / 13644 ツリー ←次へ | 前へ→

【37214】セルの転記 マキチャン 06/4/25(火) 20:30 質問[未読]
【37220】Re:セルの転記 ichinose 06/4/25(火) 21:36 発言[未読]
【37222】Re:セルの転記 ichinose 06/4/26(水) 6:39 発言[未読]
【37227】Re:セルの転記 マキチャン 06/4/26(水) 12:46 お礼[未読]
【37225】Re:セルの転記 ハト 06/4/26(水) 12:03 発言[未読]
【37228】Re:セルの転記 マキチャン 06/4/26(水) 12:54 お礼[未読]

【37214】セルの転記
質問  マキチャン  - 06/4/25(火) 20:30 -

引用なし
パスワード
   http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=37121;id=excel
この続きです。続きに質問しようと試みたのですがどうしてもできなかったので
新しく投稿しました。すみません。

もうひとつ質問させてください。
コピー元のセルが離れていて、コピー先のセルが連続している場合、
教えていただいた方法でできるのですが、コピー先もセルが離れていると
教えていただいた方法でもできません。例えば、コピー元がA1,B1とC3のとき
コピー先がA10、B10とC12のとき次のようにすると
Dim A As Range
Dim B As Range
Dim C As Range
Dim I As Long

Set A = Range("A1:B1,C3")
Set B = Range("A10:B10,C12")

I = 1
For Each C In A
B(I).Value = C.Value
I = I + 1
Next C

C3はA11にコピーされてしまいます。

そこで、考えた結果次のようにしてみました。
Dim A As Range
Dim B As Range
Dim C As Range
Dim D As Range
Dim WK As Range
Dim I As Long
Dim J As Long

Set A = Range("A1:B1,C3")
Set WK = Range("A20:C20")
Set B = Range("A10:B10,C12")

I = 1
For Each C In A
 WK(I).Value = C.Value
 I = I + 1
Next C

J = 1
For Each D In B
 D.Value = WK(J).Value
 J = J + 1
Next D

すなわち、連続するワークエリアを使用して、ステップ1として
ワークエリアに転記する。ステップ2としてワークエリアから
目的のコピー先に転記する。これで、目的は果たせます。
何の問題も無いと思われますが、どうも、2ステップ踏むことと
ワークエリアを使用するのが少しダサいような気がします。
1ステップでできる方法がもしあるようなら教えてください。
私の頭ではこれ以外思いつきません。

【37220】Re:セルの転記
発言  ichinose  - 06/4/25(火) 21:36 -

引用なし
パスワード
   ▼マキチャン さん:
こんばんは。
ダサいとは思いませんけどねえ!!

'=============================
Sub main()
  Dim r As Long
  Dim c As Long
  Dim crng As Range
  Dim orng As Range
  Set orng = Range("a10")
  With Range("A1:B1,C3")
    r = .Cells(1).Row
    c = .Cells(1).Column
    For Each crng In .Cells
     orng.Offset(crng.Row - r, crng.Column - c).Value = crng.Value
     Next
    End With
End Sub

こういうことでしょうか?

【37222】Re:セルの転記
発言  ichinose  - 06/4/26(水) 6:39 -

引用なし
パスワード
   おはようございます。

以下のコードだとコピー元のセル範囲が広範囲の場合
(例えば、コピー元が"$A$1:$Q$16,$S$13:$CR$29,$G$18:$M$25,$A$19:$C$27"、
 コピー先 "C40" )
エリアでループさせる分だけループ回数が少なくなって、処理速度が
速いですね!!

コピー元のセル範囲が小さい場合は、どっちでもよいのですが・・。


Sub main3()
  Dim r As Long
  Dim c As Long
  Dim crng As Range
  Dim orng As Range
  Set orng = Range("c40")
  With Range("$A$1:$Q$16,$S$13:$CR$29,$G$18:$M$25,$A$19:$C$27")
    r = .Cells(1).Row
    c = .Cells(1).Column
    For Each crng In .Areas
     orng.Offset(crng.Row - r, crng.Column - c). _
         Resize(crng.Rows.Count, crng.Columns.Count).Value = crng.Value
     Next
    End With
End Sub

【37225】Re:セルの転記
発言  ハト  - 06/4/26(水) 12:03 -

引用なし
パスワード
   おはようございます
▼マキチャン さん:

ちょっと変則ですが、コピー元、コピー先の数が多くなければ
下のやり方もあります
これなら、元、先の配置が違っていてもできます

Sub test()

Dim A As Range
Dim B
Dim C As Range
Dim I As Long

Set A = Range("A1:B1,C3")
B = Array("A10", "B10", "C12")

I = 0
For Each C In A

  Range(B(I)).Value = C.Value
  I = I + 1

Next C


End Sub

【37227】Re:セルの転記
お礼  マキチャン  - 06/4/26(水) 12:46 -

引用なし
パスワード
   ichinoseさん ありがとうございます。
なるほど、考えれば、やり方はあるものですね。
なるほどと思いました。
せっかく教えていただいたのですが、
私の考えたものでも、ダサいとは思いませんとのこと。
なら、どうしても、1ステップにすることに固守しないで
2ステップにしたほうが、分かりやすいかもしれません。
特に、他の人があとでメンテナンスするような場合を考えると、
なるべく、分かりやすいほうがいいかもしれません。
教えていただいたものは、これで、他にも生かしようが
有りそうなので、メモさせてもらい、活用させていただきます。
ありがとうございました。

【37228】Re:セルの転記
お礼  マキチャン  - 06/4/26(水) 12:54 -

引用なし
パスワード
   ハトさん 回答ありがとうございます。
なるほど、配列を使うんですね。
配列という言葉は知っていたのですが、具体的な使い方は
知らなかったので勉強になります。
なんとなく、配列を使えばいいかなとも思っていたのですが、
たとえ使用しても、いったんAの内容を配列に入れて、
次に、配列からBに入れるなら、私の考えた方法とほとんど
同じで、ワークエリアをシート上に確保する代わりに、メモリー
上に確保するだけで、やはり2ステップかかるのではないかと
思っていました。
配列は、このように使うんですね。
ありがとうございました。

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