[[20170129013423]] 『変数のコピーがわかりません』(卒論終わらんorz) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『変数のコピーがわかりません』(卒論終わらんorz)

マクロを勉強しだして1時間のど素人です。
1082行から2164行目まで8個飛ばしで行全体をコピーしたくて下のように組んでみたのですが全然わかりません助けてください。

Sub ()

Dim i As Integer
For i = 1082 To 2164 Step 8
Sheets("Sheet3").Rows(i).Copy
Next i

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 コピーしたものを、どこにペーストしたいのでしょうか?

(β) 2017/01/29(日) 07:18


すでにポイントをついた指摘をいただいています。
 
一行毎のコピーがクリップボードに累積することを期待しているのでしょうか。
まとめてペイストすれば良いと。
 
しかし、コピーが勝手に累積していったら、
昔のものとつながって、普通は困りますよ。
こちらの都合を、Excel君が判断してくれるわけもないです。
 
・行をUnionで累積していって、その結果を一回コピーペイストするか、
・行毎にコピーペイストを繰り返すか、
いずれかでしょう。
後者のほうが簡単でしょうか。

(γ) 2017/01/29(日) 08:32


 エクセルのシート間でのコピー、ペーストだと仮定すると、
 Sheet3がコピー元、Sheet4がコピー先ってことで、いいですかね?

 たかだか、135行ぐらいなら、行毎にコピーペイストを繰り返すのが、
 簡単でいいでしょう。

 5000行以上あったら、作業列を用いて、
 【並べ替え】または、【フィルター】処理した後に、
 コピーして、元に戻すって方法かな…?

 >γさん
 >行をUnionで累積
 20行分ぐらいしか、Unionで一度に処理できなかったような?

 それとも、コピー先が、エクセルじゃなくて、メモ帳とか、違うアプリ  ですかね?
 γさんがおっしゃるように、コピー先は考えないで、
 クリップボードにコピーするだけですかね?

 それと、行全体ってありますけど。列は決まってないんですかね。
 本当に? A〜Z列までで十分だったりしませんか?

(マリオ) 2017/01/29(日) 10:02


 >>20行分ぐらいしか、Unionで一度に処理できなかったような?

 えっ? そんなことはないですよ。
 以下の例は、1000個ほどしか結合していませんが、実際はもっともっと可能です。
 (アドレス文字列は制限がありますが)

 Sub Test()
    Dim r As Range
    Dim i As Long

    For i = 1 To 2000 Step 2
        If r Is Nothing Then
            Set r = Cells(i, "A")
        Else
            Set r = Union(r, Cells(i, "A"))
        End If
    Next

    MsgBox r.Address & vbLf & r.Count

    r.Select

 End Sub

(β) 2017/01/29(日) 10:24


 ↑ アップしたコードは単一セルのUNION ですが、行領域にしても同じです。

(β) 2017/01/29(日) 10:56


> >γさん
> >行をUnionで累積
> 20行分ぐらいしか、Unionで一度に処理できなかったような?
すでにご指摘いただいたように、
繰り返しを使うので、ふたつの領域をUnionするだけです。

(γ) 2017/01/29(日) 14:40


遅くなりました。
無事解決できました。
助かりました。
(卒論終わらんorz) 2017/01/30(月) 00:01

 >γさん、βさん
 >繰り返しを使うので、ふたつの領域をUnionするだけです。
 Set r = Union(r, Cells(i, "A"))
 とすれば、いいのか〜
 繰返して、Setし直すんですね。Unionする領域は2つだけですね。

 余談ですが…、一度にUnionできるセル領域は★30個までですね。下記の例だと、test1はNG1で、test2はOK
 ★セル領域の30個制限は、マクロじゃなくて、関数でも、いくつかありますね。SUM関数とか

 Sub test1()
  Dim r As Range
  Set r = Union(Cells(1, "A"), Cells(2, "A"), Cells(3, "A"), Cells(4, "A"), Cells(5, "A"), _
                Cells(6, "A"), Cells(7, "A"), Cells(8, "A"), Cells(9, "A"), Cells(10, "A"), _
                Cells(11, "A"), Cells(12, "A"), Cells(13, "A"), Cells(14, "A"), Cells(15, "A"), _
                Cells(16, "A"), Cells(17, "A"), Cells(18, "A"), Cells(19, "A"), Cells(20, "A"), _
                Cells(21, "A"), Cells(22, "A"), Cells(23, "A"), Cells(24, "A"), Cells(25, "A"), _
                Cells(26, "A"), Cells(27, "A"), Cells(28, "A"), Cells(29, "A"), Cells(30, "A"), _
                Cells(31, "A"))
  MsgBox r.Address
 End Sub

 Sub test2()
  Dim r As Range
  Set r = Union(Cells(1, "A"), Cells(2, "A"), Cells(3, "A"), Cells(4, "A"), Cells(5, "A"), _
                Cells(6, "A"), Cells(7, "A"), Cells(8, "A"), Cells(9, "A"), Cells(10, "A"), _
                Cells(11, "A"), Cells(12, "A"), Cells(13, "A"), Cells(14, "A"), Cells(15, "A"), _
                Cells(16, "A"), Cells(17, "A"), Cells(18, "A"), Cells(19, "A"), Cells(20, "A"), _
                Cells(21, "A"), Cells(22, "A"), Cells(23, "A"), Cells(24, "A"), Cells(25, "A"), _
                Cells(26, "A"), Cells(27, "A"), Cells(28, "A"), Cells(29, "A"), Cells(30, "A"))
  MsgBox r.Address
 End Sub

(マリオ) 2017/01/30(月) 04:18


 βさんのTestコード【(β) 2017/01/29(日) 10:24】で、
 Debug.Print r.Address & vbLf & r.Count
 してみたら、イミディエイトウィンドウには次のように記述されました。
 *****************************************************************
$A$1,$A$3,$A$5,$A$7,$A$9,$A$11,$A$13,$A$15,$A$17,$A$19,$A$21,$A$23,$A$25,$A$27,$A$29,$A$31,$A$33,$A$35,$A$37,$A$39,$A$41,$A$43,$A$45,$A$47,$A$49,$A$51,$A$53,$A$55,$A$57,$A$59,$A$61,$A$63,$A$65,$A$67,$A$69,$A$71,$A$73,$A$75,$A$77,$A$79,$A$81,$A$83,$A$85
1000
 *****************************************************************
 r.Addressの文字列で記録できるのは、43個までみたいです。
 $A$1〜$A$85は、$A$1〜$A$86で【86】あると仮定すると、
 86÷2=43(奇数のものだけは、半分の43)
 ★ただ、文字列としては、43個でも、実際には
 rには、1000個のセル範囲が記録されているみたいですね。

 卒論終わらんorzさんの要望に応えると、次のようなコードでしょうか。
 *****************************************************************
 Sub Test3()
    Dim r As Range
    Dim i As Long
    Dim sh1 As Worksheet, sh2 As Worksheet
    Set sh1 = ThisWorkbook.Sheets("Sheet3") '★コピー元シート
    Set sh2 = ThisWorkbook.Sheets("Sheet4") '★コピー先シート
    Dim sc As Integer
    Dim fc As Integer
    sc = 1 '★コピー元シートの開始列
    fc = Columns.Count '★コピー元シートの最終列

    For i = 1082 To 2164 Step 8'★コピー元シートの開始行と最終行(※8行飛ばし)
        If r Is Nothing Then
            Set r = sh1.Range(sh1.Cells(i, sc), sh1.Cells(i, fc))
        Else
            Set r = Union(r, sh1.Range(sh1.Cells(i, sc), sh1.Cells(i, fc)))
        End If
    Next
    Debug.Print r.Address & vbLf & r.Count 'イミディエイトウィンドウで確認
    r.Copy 'コピーして
    sh2.Range("A1").PasteSpecial '★コピー先のシートに貼付け(A1を基準セルにして)書式も
    '★値だけならコチラ
    'Sheets("Sheet4").Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False 'コピーモードを解除
 End Sub

(マリオ) 2017/01/30(月) 04:18


追加情報。
アドレス文字列には256文字の制限あり。たぶん。
ただし、Rangeオブジェクトそのものが、
それに制約される訳でもありません。

(γ) 2017/01/30(月) 08:37


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.