Excel VBA質問箱 IV

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

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


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

【7808】範囲の移動&繰り返しの初心者の質問です。 ゆう 03/9/18(木) 20:21 質問
【7810】Re:範囲の移動&繰り返しの初心者の質問です... ichinose 03/9/18(木) 21:25 回答
【7813】Re:範囲の移動&繰り返しの初心者の質問です... ichinose 03/9/18(木) 22:34 発言
【7814】Re:範囲の移動&繰り返しの初心者の質問です... ゆう 03/9/18(木) 22:43 発言
【7817】Re:範囲の移動&繰り返しの初心者の質問です... ichinose 03/9/19(金) 0:40 発言
【7825】Re:範囲の移動&繰り返しの初心者の質問です... ゆう 03/9/19(金) 10:40 お礼

【7808】範囲の移動&繰り返しの初心者の質問です。
質問  ゆう  - 03/9/18(木) 20:21 -

引用なし
パスワード
   わからなくってパニックです。みなさんならどうされますか?
プラットホームはMACのExcell2001です。

まずA1〜J1は見出し項目が入っています。
この下の行からデータが入っています。(データは文字列)

流れとして
1:A1〜J1のデータを削除してA2〜J2をA1〜J1の位置に移動
2:A3〜J3をK1〜T1の位置に移動
その後A4〜J4をA2〜J2の位置に移動〜というように繰り返したいのです。
そしてA列にデータが無かったらA1に戻ってきたいのです。
だいたい処理をするのが1,000行ぐらいです。

上のが2行の移動なのですが、同一処理で8行の移動もあるのです。
A1〜J1→削除
A2〜J2→A1〜J1
A3〜J3→K1〜T1
A4〜J4→U1〜AD1
A5〜J5→AE1〜AN1
A6〜J6→AO1〜AX1
A7〜J7→AY1〜BH1
A8〜J8→BI1〜BR1
A9〜J89→BS1〜CB1

A10〜J10→A2〜J2

上の2つを勝手ではありますが教えて下さいませ。
よろしくお願いします。

【7810】Re:範囲の移動&繰り返しの初心者の質問で...
回答  ichinose  - 03/9/18(木) 21:25 -

引用なし
パスワード
   ▼ゆう さん:
こんばんは。
アクティブシートを対象にしています。
'========================================================
Sub 行2移動()
  Application.ScreenUpdating = True
  Call 移動(2)
  Application.ScreenUpdating = False
End Sub
'========================================================
Sub 行8移動()
  Application.ScreenUpdating = True
  Call 移動(8)
  Application.ScreenUpdating = False
End Sub
'========================================================
Sub 移動(Keynum As Long)
For idx = 2 To Cells(Rows.Count, 1).End(xlUp).Row
  Range(Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 1), Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 10)).Value = _
    Range(Cells(idx, 1), Cells(idx, 10)).Value
  Range(Cells(idx, 1), Cells(idx, 10)).Value = ""
  Next
End Sub

確認してみて下さい。

【7813】Re:範囲の移動&繰り返しの初心者の質問で...
発言  ichinose  - 03/9/18(木) 22:34 -

引用なし
パスワード
   >▼ゆう さん:
True/Falseが逆でした。ごめんなさい。
>こんばんは。
>アクティブシートを対象にしています。
>'========================================================
>Sub 行2移動()
  Application.ScreenUpdating = false
>  Call 移動(2)
  Application.ScreenUpdating = true
>End Sub
>'========================================================
>Sub 行8移動()
>  Application.ScreenUpdating = false
>  Call 移動(8)
>  Application.ScreenUpdating = true
>End Sub
>'========================================================
>Sub 移動(Keynum As Long)
>For idx = 2 To Cells(Rows.Count, 1).End(xlUp).Row
>  Range(Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 1), Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 10)).Value = _
>    Range(Cells(idx, 1), Cells(idx, 10)).Value
>  Range(Cells(idx, 1), Cells(idx, 10)).Value = ""
>  Next
>End Sub
>
>確認してみて下さい。

【7814】Re:範囲の移動&繰り返しの初心者の質問で...
発言  ゆう  - 03/9/18(木) 22:43 -

引用なし
パスワード
   ▼ichinose さんへ:
速攻のお返事ありがとうございました。
今確認しました。

1点だけ問題点があったのですが
C行でセルの文字列のデータで全角スペースが入るモノがC行に残ってしましました。具体的に書きますと移動を2回するものだと
C行="A B"だとするとC1には問題なく"A B"がきますがM1には"B"だけがいどうされC行の下には"A"だけが残っている感じです。

こんな表現でわかっていただけるでしょうか?
ただ他の部分は完璧です。
完璧すぎて初心者の私にはコードを見ても?な部分が多く
もしお時間があれば簡単なコメントを入れていただければ
もう少し次につなげられると思います。
勝手なお願いを何度もしてすみません。
よろしくお願いいたします。

【7817】Re:範囲の移動&繰り返しの初心者の質問で...
発言  ichinose  - 03/9/19(金) 0:40 -

引用なし
パスワード
   ▼ゆう さん:
こんばんは。

Macで確認しておりません
(というより、持ってませんし、正直、わかりません)。

>1点だけ問題点があったのですが
>C行でセルの文字列のデータで全角スペースが入るモノがC行に残ってしましました。具体的に書きますと移動を2回するものだと
>C行="A B"だとするとC1には問題なく"A B"がきますがM1には"B"だけがいどうされC行の下には"A"だけが残っている感じです。
>こんな表現でわかっていただけるでしょうか?
意味はわかりました。ただ、↑の現象が確認できません・・。
こんなデータでテストしましたが、
   A    B    C  ・・・・・・J
1 項目1  項目2  項目3 ・・・・・項目10
2 A B  A B  A B ・・・  A B
3 A B  A B  A B ・・・  A B
4 A B  A B  A B ・・・  A B
5 A B  A B  A B ・・・  A B
6 A B  A B  A B ・・・  A B




16 A B  A B  A B ・・・  A B
    
というようにセルA1〜J10に項目名、セルA2〜J16まで、全て「A B」
というデータを入れて、
プロシジャー「行2移動」を実行させましたが、
正常に配置されています。
不具合が発生する最も簡単なデータ例を記述していただければ
こちらでも確認します。

>もしお時間があれば簡単なコメントを入れていただければ
>もう少し次につなげられると思います。

Sub 移動(Keynum As Long)
For idx = 2 To Cells(Rows.Count, 1).End(xlUp).Row
  Range(Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 1), _
     Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 10)).Value = _
         Range(Cells(idx, 1), Cells(idx, 10)).Value
  Range(Cells(idx, 1), Cells(idx, 10)).Value = ""
  Next
End Sub
↑これの内容ですよね?
2行づつ移動する場合を考えてみます。

A列にあるセルがどこに移動すればよいかを考えます。

元の行  新しい行  新しい列
 2     1     1(A列)
 3     1     11(K列)
 4     2     1
 5     2     11
 ・
 ・
2行目のセルA2にあったデータは、1行目の1列(A列)に移動する。
3行目のセルA3にあったデータは、1行目の11列(K列)に移動する。
ってことは、元の行数から何らかの計算式で移動する行と列が導き出されれば
OKですよね?
fx(2)=1、fx(3)=1、fx(4)=2、fx(5)=2のような新しい行位置を算出する計算式と
gx(2)=1、gx(3)=11、gx(4)=1、gx(5)=11のような新しい列位置を算出する計算式。

新しい行=(元の行-2)/2の整数部 + 1
新しい列=(元の行-2)/2の余り * 10 + 1

で、うえの表のとおりになりますよね?

8行づつ移動する場合も表を作ってみて下さい(省略しますが)

新しい行=(元の行-2)/8の整数部 + 1
新しい列=(元の行-2)/8の余り * 10 + 1

となると思います。
上記の式を元のデータのA列の移動セルとするようにVBAで記述すると

Cells((idx - 2) \ Keynum + 1, ((idx - 2) Mod Keynum) * 10 + 1)

のようになります(不具合があるから心配だけど)。

idx・・・・元の行
Keynum・・何行づつ移動するかという行数

移動するコードがFor〜Nextを用いて、2行目から、
A列の終わりまで繰り返されています。

異常(シャレ)ですが、わかっていただけますか?

不具合の例題データ、是非教えて下さい。

【7825】Re:範囲の移動&繰り返しの初心者の質問で...
お礼  ゆう  - 03/9/19(金) 10:40 -

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

ごめんなさい。
もう一度確認したところC行には書式設定でユーザー定義された"A"があったのです。なのでMに移動されたデータは"B"でOKだったのです。
書式設定で文字列に戻したら問題なく移動できました。
おはずかしい限りです。

また詳細な説明ありがとうございました。
正直自分でもあるところまでやってみたのですがichinose さんのコードを
ためして目からウロコでした。
今回のことをステップアップにVBAをまた頑張ろうと思います。
また挫折しそうになった時はアドバイスお願いします。
ichinose さん本当に感謝しています。
ありがとうございました。
※ちなみにMACでも問題なく動いています。

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