Q&A
解決済み

【Excel】VBAを利用した行のシャッフルを教えてください🙏

Yurane
Yuraneさん
レギュラー

ExcelのVBAを利用した行のシャッフルを行いたいのですが、ネットなどでも情報がなかったので方法を教えていただきたいです🙇

【プログラム】
自分の想像しているプログラムは以下のような感じです。

ActiveXコントロール コマンドボタンを押す

A1セルからB列のデータが最後にある行までを選択する

選択した行をランダムに並び替える

...という流れになりますm(_ _)m

◎分かるようでしたら、そのプログラムの内容がどんなものかも教えていただけると嬉しいです⸜( ˶'ᵕ'˶)⸝


5 件の回答

iPhone XR(mineo(au)) medal ベストアンサー獲得数 34 件

excelsort.png

こんにちは😊

こんなのでどうですか?
私はExcelに慣れていないので、もっと良い方法はあると思います。

CommandButton1 を設置して、クリックしたときの処理です。

Private Sub CommandButton1_Click()

'何行目まであるか取得します
Dim n As Integer
n = Cells(Rows.Count, 1).End(xlUp).Row

'C列に1行追加します
Range("C1").EntireColumn.Insert xlShiftToRight

'C列に乱数を入れます
Dim i As Integer
For i = 2 To n
Range("C" & i) = "=Rand()"
Next i

'C列をキーにして並び替えます。先頭行は見出し扱いにします
Range("A2", "C" & n).EntireColumn.Sort Key1:=Range("C2", "C" & n), Header:=xlYes

'並び替え乱数に使ったC列を削除します
Range("C1").EntireColumn.Delete

End Sub
  • 2
あいだの1件を表示
ベストアンサー
ベストアンサー

iPhone XR(mineo(au)) medal ベストアンサー獲得数 34 件

mineo-vba2.png

>>4 Yuraneさん

こんにちは😊
With を使うことができます。
これは、Sheet2 にCommandButtun1 を作ってSheet1を操作します。
With ~ End With までの命令で、「.」を最初に付けると、
Sheets("Sheet1").
が最初に付いているものと同じ意味になります。

Private Sub CommandButton1_Click()

With Sheets("Sheet1") 'With入れます

Dim n As Integer
n = .Cells(Rows.Count, 1).End(xlUp).Row '.Cells で使っています

.Range("C1").EntireColumn.Insert xlShiftToRight '.Rangeで使っています

Dim i As Integer
For i = 2 To n
.Range("C" & i) = "=Rand()" ' .Rangeで使っています
Next i

'次の文は、最初の .Range と引数Key1の.Range で使っています
.Range("A2", "C" & n).EntireColumn.Sort Key1:=.Range("C2", "C" & n), Header:=xlYes


.Range("C1").EntireColumn.Delete '.Rangeで使っています

End With 'ここでWith終わりです

End Sub
ベストアンサー この回答はベストアンサーに選ばれました。
  • 9
Yurane
Yuraneさん・質問者
レギュラー

Reno A (mineo(docomo))

>>9 Y. Daemon@ポリアモラスさん
細かい説明や画像付きでとてもわかりやすかったです。無事設定もできました🙆♀ ありがとうございました!
  • 10

medal ベストアンサー獲得数 157 件

パソコンが無いので取りあえず構想だけ
(「VBAの記録」で後で微調整)

①C1に「=rand()」
②A列B列の最終行までオートフィル
・データが連続していればOK
・データが連続していない場合は最終行の判定が必要?
(面倒なら1,000行とか10,000行のあり得ない行数で代用?)
③A1:C??(最終行)を範囲指定
④C列でソート(条件適当でOK?)
⑤C列を全削除

問題点・不明点があれば再度質問下さい。
  • 1

medal ベストアンサー獲得数 157 件

【(構想を真◯されたので)進化版】
パソコンが無いので取りあえず構想だけ
(「VBAの記録」で後で微調整)

①C1に「=IF(A1&B1="",0,rand())」
②C2:C99999(あり得ない行数)迄コピー
③A1:C99999(あり得ない行数)を範囲指定
④C列を降順でソート
⑤C列を全削除

上記方法(進化版)ならデータが飛んでいれば自動的に詰まります。
問題点・不明点があれば再度質問下さい。
  • 3
BM320I
BM320Iさん
Gマスター

Pixel 3a(Y!mobile) medal ベストアンサー獲得数 954 件

>>4 Yuraneさん
できますよ、sheet1へ移動する、、を学習させ、組み合わせるだけですよ。
  • 5
あいだの1件を表示
BM320I
BM320Iさん
Gマスター

Pixel 3a(Y!mobile) medal ベストアンサー獲得数 954 件

>>6 Yuraneさん
Sheets("Sheet1").Select
かと。お試しください。
  • 7
Yurane
Yuraneさん・質問者
レギュラー

Reno A (mineo(docomo))

>>7 BM320Iさん
ありがとうございます!
  • 11

medal ベストアンサー獲得数 157 件

一度自分が手動でソートする動作を「VBAの記録」すると、シート移動等も全部記録されるので、それを微調整して行った方が
①コードを全部書かなくても良い。
②分からないコードを(検索して)理解・学習しやすい。
と言うメリットが有ります。

どの動作がどのコードか分からない場合は、動作1つずつ「VBAの記録」すると分かりやすいです。
  • 8
Yurane
Yuraneさん・質問者
レギュラー

Reno A (mineo(docomo))

>>8 blue777さん
そちらのほうが便利ですね🤔 次回試してみます!
  • 12