Excel VBA質問箱 IV

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

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


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

【70437】入れ替え rina 11/11/16(水) 12:48 質問[未読]
【70438】Re:入れ替え Jaka 11/11/16(水) 14:01 発言[未読]
【70440】Re:入れ替え rina 11/11/16(水) 15:07 発言[未読]
【70441】Re:入れ替え Jaka 11/11/16(水) 16:08 発言[未読]
【70442】Re:入れ替え UO3 11/11/16(水) 16:49 発言[未読]
【70445】Re:入れ替え rina 11/11/16(水) 17:41 お礼[未読]
【70443】Re:入れ替え UO3 11/11/16(水) 17:03 発言[未読]
【70446】Re:入れ替え rina 11/11/16(水) 17:51 お礼[未読]

【70437】入れ替え
質問  rina  - 11/11/16(水) 12:48 -

引用なし
パスワード
   こんにちわ、はじめまして。
最近、マクロの勉強をしている初心者です。

現在、行の入れ替えのマクロを作成しており、
下記のようなコードで作成してみました。
Range("J8:BK16") のように、この範囲をひとまとまりの行として考えてます。

不格好だとは思いますが、これで成功しているのですが、
今後、行が増えていった場合に、コードも増えていくかと思い悩んでました。

コードを増やす事なく、入れ替え行を増殖できるような方法はあるのでしょうか?


Sub 移動1()
  Application.ScreenUpdating = False
  Range("J8:BK16").Select
  Selection.Cut
  Range("J26:BK34").Select
  Selection.Insert shift:=xlDown
  Range("J17").Select
End Sub

Sub 移動2()
  Application.ScreenUpdating = False
  Range("J17:BK25").Select
  Selection.Cut
  Range("J35:BK43").Select
  Selection.Insert shift:=xlDown
  Range("J26").Select
End Sub

【70438】Re:入れ替え
発言  Jaka  - 11/11/16(水) 14:01 -

引用なし
パスワード
   ▼rina さん:
>今後、行が増えていった場合に、コードも増えていくかと思い悩んでました。
>コードを増やす事なく、入れ替え行を増殖できるような方法はあるのでしょうか?

すみません。
いまいち何がやりたいコードなのか読み取れませんでした。

最終行は、
MsgBox Range("J" & Rows.Count).End(xlUp).Row
などで解ります。
カットする範囲の見極め、貼り付ける場所の見極めが解りませんでした。
ある程度の法則があるなら、出来るかと思います。

【70440】Re:入れ替え
発言  rina  - 11/11/16(水) 15:07 -

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

>すみません。
>いまいち何がやりたいコードなのか読み取れませんでした。


説明下手で申し訳ございません。


┌─────┐
│     │ ← 1.
├─────┤
│     │ ← 2.
├─────┤
│     │ ← 3.

   ・    
   ・
   ・


上記の1.、2.、3.のような枠を、
セルを結合して作成しており、
その結合された同じ枠が下部へといくつか続いております。

入れ替えというのは、
その結合した枠ごと、ごっそりと入れ替えたかった訳です。

1.の結合枠と2.の結合枠を入れ替えたり、
2.の結合枠と3.の結合枠を入れ替えたりなど。。。

【70441】Re:入れ替え
発言  Jaka  - 11/11/16(水) 16:08 -

引用なし
パスワード
   結合セルなの....。
セルの結合とマクロは相性が悪いんで、あまりやった事がないので

私なら、1度範囲全体をどこかに貼り付けてストック後に入れ替えして、
ストックしていたものを入れたい場所に戻すって手法をとるんじゃないかと思います。
結合の具合によっては、一旦解除してから移動後最後にまた結合の方法をとるかも知れないです。

結合セルがあると、
Rnge("A" & rows.count).end(xlup).row
が、うまくいかない時があったような気がするので、やっぱり1度結合を全解除するかも。

【70442】Re:入れ替え
発言  UO3  - 11/11/16(水) 16:49 -

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

こんにちは

コードを拝見する限り、説明されたこととはちょっと違いますね。
指定した領域を、別に指定した領域の「上」の領域に「挿入移動」するということでしょうか。

いずれにしても、「どの領域」を「別のどの領域」に対して、この処理を行うかは
VBAに教えてあげないと、VBAは、何もできませんよね。
といって、膨大なForm/Toの組合せを全て用意するのは、非現実的なので、何か方法は
ないだろうかという質問だと推察します。

ということが、正しいとすれば、たとえば、それぞれの領域の先頭のJ列をマウスで
選ばさせて実行するコード案です。

Sub 移動()
  Dim adr1 As Range
  Dim adr2 As Range
  On Error Resume Next
  Set adr1 = Application.InputBox("移動させたい領域のJ列を選択してください", Type:=8)
  On Error GoTo 0
  If Not adr1 Is Nothing Then
    On Error Resume Next
    Set adr2 = Application.InputBox("挿入させたい領域のJ列を選択してください", Type:=8)
    On Error GoTo 0
    If Not adr2 Is Nothing Then
      Application.ScreenUpdating = False
      adr1.Resize(9, 54).Cut
      Range("A13:F15").Select
      adr2.Resize(9, 54).Insert Shift:=xlDown
      adr1.Offset(9).Select
      Application.ScreenUpdating = True
    End If
  End If
  Set adr1 = Nothing
  Set adr2 = Nothing
End Sub

【70443】Re:入れ替え
発言  UO3  - 11/11/16(水) 17:03 -

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

↑の Range("A13:F15").Select
これはテスト時のコードで不要です。

もしイメージしておられることが、From/Toはコード内で与えたい。
でもコード量を減らしたいということであれば以下のような構成も考えられます。

Sub Test()
  移動x 8, 26
  移動x 17, 35
End Sub

Private Sub 移動x(fR As Long, tR As Long)
  Application.ScreenUpdating = False
  Cells(fR, "J").Resize(9, 54).Cut
  Cells(tR, "J").Resize(9, 54).Insert Shift:=xlDown
  Cells(fR, "J").Offset(9).Select
  Application.ScreenUpdating = True
End Sub

【70445】Re:入れ替え
お礼  rina  - 11/11/16(水) 17:41 -

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

ご回答ありがとうございます。

>コードを拝見する限り、説明されたこととはちょっと違いますね。
>指定した領域を、別に指定した領域の「上」の領域に「挿入移動」するということでしょうか。

説明がうまくできずに申し訳ございません。
私が扱っていたコードは挿入移動という表現になるのですね。
見た目、上下の枠が入れ替わってたんで、入れ替えという表現を使ってしまって、、

申し訳ないです・・・


>いずれにしても、「どの領域」を「別のどの領域」に対して、この処理を行うかは
>VBAに教えてあげないと、VBAは、何もできませんよね。
>といって、膨大なForm/Toの組合せを全て用意するのは、非現実的なので、何か方法は
>ないだろうかという質問だと推察します。


まさに、その通りです。
解釈して頂いてありがとうございます。


>ということが、正しいとすれば、たとえば、それぞれの領域の先頭のJ列をマウスで
>選ばさせて実行するコード案です。

質問後、色々と考えていて、
今ココにご指南頂いた方法でもいいのでは?と思っていたところです。
(コードはまったく浮かびませんでしたが。)

早速使用してみましたが、
イメージ通りにできており、大満足でした。ありがとうございます。

これを活用しながら、さらに勉強していこうと思います。
助かりました。


そして、日本語ももう少し勉強します。
ちゃんと質問できるように。。。。

【70446】Re:入れ替え
お礼  rina  - 11/11/16(水) 17:51 -

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

>もしイメージしておられることが、From/Toはコード内で与えたい。
>でもコード量を減らしたいということであれば以下のような構成も考えられます。
>

こちらは、私がやっていたような事なのかな?
色々なやり方があるんですね。

このようなスマートなコードを書けるように
もっともっと勉強します。

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