過去ログ

                                Page     236
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼文字をランダムに並び替えるには?  おんじい 02/10/20(日) 23:18
   ┣Re:文字をランダムに並び替えるには?  りん 02/10/21(月) 21:23
   ┗Re:文字をランダムに並び替えるには?  Ron 02/10/21(月) 22:53

 ───────────────────────────────────────
 ■題名 : 文字をランダムに並び替えるには?
 ■名前 : おんじい
 ■日付 : 02/10/20(日) 23:18
 -------------------------------------------------------------------------
   選択したセル内の文字をランダムに並び替えるマクロを組みたいんですが、
なかなか思うように組めませんでした。
例で挙げると
  A  B  C
1東京 札幌 福井
2大坂 三重 京都
3宮崎 大分 福岡
4新潟 佐渡 岩手

というファイル内の(A1)から(A4)までを選んで
ランダムに入れ替え、さらに(B1)から(B4)までを選んで
同様にランダムに入れ替えていく
という感じですが、
どなたか教えてください。よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:文字をランダムに並び替えるには?  ■名前 : りん <rin_doggie@hotmail.com>  ■日付 : 02/10/21(月) 21:23  -------------------------------------------------------------------------
   おんじい さん、こんばんわ。

>選択したセル内の文字をランダムに並び替えるマクロを組みたいんですが、

作業用のシートに選択範囲を貼り付けて、ソートして戻す方法です。

Sub Test()
  Dim r1 As Range, ws As Worksheet, Rmax&
  If TypeName(Selection) <> "Range" Then
    MsgBox TypeName(Selection), vbCritical, "セル範囲を指定してから実行"
  Else
    Set r1 = Selection
    Rmax& = r1.Count 'セル個数
    '
    If Rmax& = 1 Then
      MsgBox "単一セル", vbInformation
    ElseIf r1.Columns.Count > 1 Then
      MsgBox "複数列", vbExclamation
    Else
      Application.ScreenUpdating = False
      '作業用ブック
      Set ws = Workbooks.Add.Worksheets(1)
      r1.Copy Destination:=ws.Cells(1, 1)
      With ws
        'ランダムな値を与える
        With .Range(.Cells(1, 2), .Cells(Rmax&, 2))
          .Formula = "=Rand()" 'ワークシート関数
          .Value = .Value
        End With
        'ソート
        .Range(.Cells(1, 1), .Cells(Rmax&, 2)).Sort _
            Key1:=.Cells(1, 2), Order1:=xlAscending, Header:=xlNo
        '元の位置に戻す
        .Range(.Cells(1, 1), .Cells(Rmax&, 1)).Copy Destination:=r1
      End With
      '作業ブック閉じる
      With ws.Parent
        .Saved = True
        .Close SaveChanges:=False
      End With
      '開放
      Set r1 = Nothing: Set ws = Nothing
      Application.ScreenUpdating = True
    End If
  End If
End Sub

件数が多くなるときは、配列を利用したほうが言いと思いますけどね。
 ───────────────────────────────────────  ■題名 : Re:文字をランダムに並び替えるには?  ■名前 : Ron  ■日付 : 02/10/21(月) 22:53  -------------------------------------------------------------------------
   こんばんは。
中途半端に配列を使ってみました。
複数列には対応してません。

Option Base 1
Sub 並び替え()

  Dim myAr As Variant
  Dim CNT As Long
  Dim i As Long
  With Selection
    If .Count = 1 Then Exit Sub
    If .Columns.Count > 1 Then Exit Sub
    myAr = .Value
    .Value = ""
    Randomize
    For CNT = 1 To .Count
back:
      i = Int(Rnd * .Count + 1)
      If Not .Find(myAr(i, 1)) Is Nothing Then GoTo back
      Cells(CNT, 1).Value = myAr(i, 1)
    Next
  End With

End Sub
では。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 236