「一気に最後まで読んだ」本、教えて下さい!

下図1のように数値が並んでいる時、下図2のように自動的に整理する方法を探しています。
つまり、左の列の値と右の列の値を比較し、値のセル番地を変える方法です。
最終的には右列の値を左列のセルでくくる形の表の完成を目指しています。
マクロを使用する必要がある場合は、おおよそのソースコードを併せて回答していただけとありがたいです。


下図1

   A  B   C
1 100 120 131
2 200 150 148
3 400 260 222
4    330 263
5    410 341
6       455


下図2

   A  B   C
1 100 120 131
2       148
3    150 222
4 200 260 263
5    330 341
6 400 410 455


よろしくお願いします。

A 回答 (2件)

こんにちは!


一例です。

画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)


Sub test() 'この行から
Dim i, j, M As Long
M = Cells(1, Columns.Count).End(xlToLeft).Column
Application.ScreenUpdating = False
For j = M - 1 To 1 Step -1
For i = 1 To Cells(Rows.Count, M).End(xlUp).Row
If Cells(i, j) > Cells(i, j + 1) Then
Cells(i, j).Insert (xlDown)
End If
Next i
Next j
Application.ScreenUpdating = True
End Sub 'この行まで

※ データは1行目からあるとします。
※ データ列は何列あっても構いませんが、一番右側列データ量が一番多いという前提です。
※ 同値の場合は同じ行にしています。m(_ _)m

この回答への補足

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


実は、乗換時刻表を作成したいと思い、今回の質問をさせていただきました。

(過去にhttp://okwave.jp/qa/q7462200.htmlでも同様の質問をさせていただいたのですが、残念ながら期待通りの結果は出せませんでした。)

ですので、実際の条件は以下の通りとなります。できれば手動で作成した実物を用いて説明したいのですが、方法が分からないので、できる限り文章で説明してみます。4以降の条件は、できればで結構です。


1.13列あり、右の列のほうが短い場合がある(例:E列はE78まで、F列はF67までなど)

2.スケジュールを書き入れるための真ん中のG列を挟んで、左側が往路、右側が復路。真ん中のG列以外は2列ずつが発車時刻と到着時刻のペアになっているため(例:A列が発車時刻、B列が到着時刻)、A・B列とL・M列のバス、C・D列とJ・K列の電車、E・F列とH・I列のバスはそれぞれ同じ路線。

3.2より、比較してくくりたいのは乗り換えにあたるB・C列間、D・E列間、F・G列間、G・H列間、I・J列間、K・L列間。できれば乗り換え時間としてそれぞれ2分、3分、1分、1分、3分、2分を設けたい。


これ以降は煩雑なため、できればで結構です。


4.一つ手前の駅から乗ることもあるため、A列より左側に、C列の配置(セル番地)に対応する列を作り、M列より右側に、K列の配置に対応する列を作りたい。

5.すぐ右の列の始発や終電との間にタイムラグがある時、とんぼ帰りをした場合の復路の発車時刻にあわせて配置したい(例:DEの電車は5時台始発、FGのバスは8時台始発といった場合、Eのうちすぐに乗り換えられない早い時間帯部分は帰路であるJの時刻にあわせる。乗り換え時間は上記同様3分で構わない)。

6.http://okwave.jp/qa/q7462200.htmlの2のように自動でレイアウトを整えたい。


よろしくお願いします。

補足日時:2012/07/03 18:30
    • good
    • 0
この回答へのお礼

回答ありがとうございました!

お礼日時:2012/07/19 00:55

「くくり」の条件が不明瞭(あいまい)なので、数列によっては意図しない結果になることも考えられます。



手順:
ALT+F11を押す
現れた画面で挿入メニューから標準モジュールを挿入する
現れたシートに下記をコピー貼り付ける


sub macro1()
 dim c as long
 dim r as long

 for c = 2 to 1 step -1
  r = 1
  do
   do until cells(r, c) <= cells(r, c + 1)
    cells(r, c).insert shift:=xlshiftdown
    cells(r, c).formular1c1 = "=R[1]C"
    r = r + 1
   loop
  r = r + 1
  loop while cells(r, c) <> ""
 next c
 on error resume next
 range("A:B").specialcells(xlcelltypeformulas).clearcontents
end sub

ABC列に数列を入れ、マクロを実行する。

この回答への補足

お早い回答ありがとうございます!


>「くくり」の条件が不明瞭(あいまい)なので、数列によっては意図しない結果になることも考えられます。

いえいえ、期待していた動きをしてくれました! 最終的に必要な条件については後述させていただきます。

実は、乗換時刻表を作成したいと思い、今回の質問をさせていただきました。

(過去にhttp://okwave.jp/qa/q7462200.htmlでも同様の質問をさせていただいたのですが、残念ながら期待通りの結果は出せませんでした。)

ですので、実際の条件は以下の通りとなります。できれば手動で作成した実物を用いて説明したいのですが、方法が分からないので、できる限り文章で説明してみます。4以降の条件は、できればで結構です。


1.13列あり、右の列のほうが短い場合がある(例:E列はE78まで、F列はF67までなど)

2.スケジュールを書き入れるための真ん中のG列を挟んで、左側が往路、右側が復路。真ん中のG列以外は2列ずつが発車時刻と到着時刻のペアになっているため(例:A列が発車時刻、B列が到着時刻)、A・B列とL・M列のバス、C・D列とJ・K列の電車、E・F列とH・I列のバスはそれぞれ同じ路線。

3.2より、比較してくくりたいのは乗り換えにあたるB・C列間、D・E列間、F・G列間、G・H列間、I・J列間、K・L列間。できれば乗り換え時間としてそれぞれ2分、3分、1分、1分、3分、2分を設けたい。


これ以降は煩雑なため、できればで結構です。


4.一つ手前の駅から乗ることもあるため、A列より左側に、C列の配置(セル番地)に対応する列を作り、M列より右側に、K列の配置に対応する列を作りたい。

5.すぐ右の列の始発や終電との間にタイムラグがある時、とんぼ帰りをした場合の復路の発車時刻にあわせて配置したい(例:DEの電車は5時台始発、FGのバスは8時台始発といった場合、Eのうちすぐに乗り換えられない早い時間帯部分は帰路であるJの時刻にあわせる。乗り換え時間は上記同様3分で構わない)。

6.http://okwave.jp/qa/q7462200.htmlの2のように自動でレイアウトを整えたい。


よろしくお願いします。

補足日時:2012/07/03 18:27
    • good
    • 0
この回答へのお礼

回答ありがとうございました。そろそろ締め切りたいと思います。

お礼日時:2012/07/19 00:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!