Excel VBA質問箱 IV

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

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


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

【77416】繰り返し コピーペースト YUKI 15/9/25(金) 14:44 質問[未読]
【77417】Re:繰り返し コピーペースト β 15/9/25(金) 16:52 発言[未読]
【77429】Re:繰り返し コピーペースト YUKI 15/10/1(木) 14:12 質問[未読]
【77430】Re:繰り返し コピーペースト β 15/10/1(木) 16:33 発言[未読]
【77431】Re:繰り返し コピーペースト β 15/10/1(木) 17:13 発言[未読]
【77434】Re:繰り返し コピーペースト YUKI 15/10/2(金) 8:14 発言[未読]
【77435】Re:繰り返し コピーペースト β 15/10/2(金) 15:07 発言[未読]
【77436】Re:繰り返し コピーペースト YUKI 15/10/2(金) 16:10 お礼[未読]

【77416】繰り返し コピーペースト
質問  YUKI  - 15/9/25(金) 14:44 -

引用なし
パスワード
   はじめまして、よろしくお願いします。
F〜AB列の4〜120行までのデータをAC列にまとめて表示したいです。
今までは全列コピーペーストのコードをやっていましたが
繰り返しコードで見やすく書き直したいです。

Range("F4:F120").Copy
  Range("AC65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
  Range("G4:G120").Copy
  Range("AC65536").End(xlUp).Offset(1, 0).PasteSpecial
・・・・

色々なサイトを調べて、見よう見まねで作成してみたら、
AC列も同じように横にずれていってしまいました・・・。
お手数お掛けしますがよろしくお願い致します

【77417】Re:繰り返し コピーペースト
発言  β  - 15/9/25(金) 16:52 -

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

一例です。

Sub Test()
  Dim r As Range
  Dim col As Range
  Dim pos As Range
  
  Application.ScreenUpdating = False
  
  Set r = Range("F4:AB120")
  
  For Each col In r.Columns
    If pos Is Nothing Then
      Set pos = Range("Ac4")
    End If
    pos.Resize(r.Rows.Count).Value = col.Value
    Set pos = pos.Offset(r.Rows.Count)
  Next
  
End Sub

【77429】Re:繰り返し コピーペースト
質問  YUKI  - 15/10/1(木) 14:12 -

引用なし
パスワード
   返信遅くなりまして申し訳ありません。

少し状況が変わりまして、
AEに纏めるデータはE4:S180へ(修正しました。)
AG〜BL(増減の可能性あり)の1〜180行のデータを
A1:180へ貼ってまとめ、元の列へ上書きとしたいです。
AE列を経由しなくても構いません
以下のコードを書きましたが、
繰り返しが上手くできず全列分このコードをVBAに書く事しかできませんでした。
現状動いてはいるのですが列の増減での修正が手間でしょうがありません。。。
よろしくお願いします


  Dim r As Range
  Dim col As Range
  Dim pos As Range
 
  Application.ScreenUpdating = False
'######AG
  Range("AE2:AE5000").Clear
  Range("AG1:AG180").Copy Range("A1:A180")
 
  Set r = Range("E4:S180")
 
  For Each col In r.Columns
    If pos Is Nothing Then
      Set pos = Range("AE4")
    End If
    pos.Resize(r.Rows.Count).Value = col.Value
    Set pos = pos.Offset(r.Rows.Count)
  Next

  Range("AE1:AE5000").Sort _
    Key1:=Range("AE1"), _
    Order1:=xlAscending, _
    Header:=xlYes, _
    Orientation:=xlTopToBottom
 
  Range("AG1:AG180").Value = Range("AE1:AE180").Value
'######AH
  Range("AE2:AE5000").Clear
  Range("AH1:AH180").Copy Range("A1:A180")
 
  Set r = Range("E4:S180")
 
  For Each col In r.Columns
    If pos Is Nothing Then
      Set pos = Range("AE4")
    End If
    pos.Resize(r.Rows.Count).Value = col.Value
    Set pos = pos.Offset(r.Rows.Count)
  Next

  Range("AE1:AE5000").Sort _
    Key1:=Range("AE1"), _
    Order1:=xlAscending, _
    Header:=xlYes, _
    Orientation:=xlTopToBottom
 
  Range("AH1:AH180").Value = Range("AE1:AE180").Value

【77430】Re:繰り返し コピーペースト
発言  β  - 15/10/1(木) 16:33 -

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

>少し状況が変わりまして、

新しい要件は今から読んで、対応しますが、それとは別に
以前の要件通りのデータで、アップしたマクロを動かした結果はどうでしたか?
それがうまくいったかどうかの連絡をください。

(要件を変えるから、動かしてもしょうがないので動かしていない ということはないですよね)

【77431】Re:繰り返し コピーペースト
発言  β  - 15/10/1(木) 17:13 -

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

要件を読んでみましたが、どうも、よくわかりません。
なので、【動くことは動いている】という、そちらのコードを読んで
要件を推測しようとしているのですが、なかなかわかりません。

そちらのコードは

・E4:S180 の領域の各列を順番に、AE4 から列単位に転記して
・出来上がった AE列を並び替えて
・それを AG1:AG180 に転記して

・また、E4:S180 の領域(つまり、↑で対象にしたのと同じデータ)の各列を順番に、AE4 から列単位に転記して
・出来上がった AE列を並び替えて
・それを AH1:AH180 に転記

この繰り返しだと思いますが、

>AG〜BL(増減の可能性あり)の1〜180行のデータを

この AG〜BLといったものがコードに登場しないのですが??

また、コードの中で、各ブロックごとに

Range("AG1:AG180").Copy Range("A1:A180")

等としていますが、コピー先の A1:A180 は、まったく参照されていません。
何をしたかったのかなぁ・・と。

具体的には何をどうしたいのですか?

【77434】Re:繰り返し コピーペースト
発言  YUKI  - 15/10/2(金) 8:14 -

引用なし
パスワード
   ▼β 様:
頂いたコードは希望どうりに動いております。ありがとうございます。
言葉足らずで申し訳ありません。。

説明が下手で重ね重ね申し訳ありません。


・A列へ1列コピー
・A列へ貼り付けたデータをE4:S180で関数を使って加工
・E4:S180のデータをAE列を使ってソート
・最初にA列へコピーした列と置き換え
それをAG列からBL列まで順に処理

現状は前回書いたコードを単純に必要列分表記してとても長いコードになっています。

【77435】Re:繰り返し コピーペースト
発言  β  - 15/10/2(金) 15:07 -

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

要件の誤解あれば指摘ください。

Sub Test2()
  Dim myA As Range
  Dim myC As Range
  Dim r As Range
  Dim col As Range
  Dim pos As Range
 
  Application.ScreenUpdating = False
  
  Set myA = Range("AG1:BL180")  '列数が増減あればここを変更
  Set r = Range("E4:S180")    '関数で生成される領域
  
  For Each myC In myA.Columns  'mya から 列単位で変数 myc に取出し
    Range("A1").Resize(myA.Rows.Count).Value = myC.Value
    myC.EntireColumn.ClearContents
    Set pos = Nothing
    For Each col In r.Columns
      If pos Is Nothing Then
        Set pos = myC.Cells(1)
      End If
      pos.Resize(r.Rows.Count).Value = col.Value
      Set pos = pos.Offset(r.Rows.Count)
    Next
    myC.Resize(Cells(Rows.Count, myC.Column).End(xlUp).Row).Sort Key1:=myC.Cells(1), Header:=xlYes
  Next
  
End Sub

【77436】Re:繰り返し コピーペースト
お礼  YUKI  - 15/10/2(金) 16:10 -

引用なし
パスワード
   ▼β さま

完璧です!!思い通りの結果になりました!
容量も激減し速度も速い・・さすがです。

教えていただいたコードを少しづつ理解し、
いつか解答できる立場になれたらなぁと思います。
本当にありがとうございました!!

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