[[20170814124245]] 『RANK関数の範囲に変数を入れたいです』(ねろ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『RANK関数の範囲に変数を入れたいです』(ねろ)

初めて質問させていただきます。
今、インプットボックスで開始と終了の範囲を決めてランダムに混ぜるファイルをつくっています。
インプットボックスは何とかでき、範囲指定の動作を登録したマクロをいじりながら格闘しているのですが、インプットボックスのマクロとうまくつながらず、シャッフルできない状態です。以下が作ってみたマクロです。

Sub Macro1()
'
' Macro1 Macro
'

    Dim ans As String
    ans = InputBox("開始", "範囲指定")

    If ans <> "" Then

        Range("L1").Value = ans + 1
        x = Range("L1").Value

    End If

    ans = InputBox("終わり", "範囲指定")

    If ans <> "" Then
        Dim y As Variant
        Range("L2").Value = ans + 1
        y = Range("L2").Value
    End If

'

    Range("E2").Select
        ActiveCell.FormulaR1C1 = "=RANK(RC[-1],R[-& x &+1]C[-1]:R[-& y &+1]C[-1])"
    Range("E2").Select
    Selection.AutoFill Destination:=Range("E2:E61"), Type:=xlFillDefault
    Range("E2:E61").Select
    ActiveWindow.SmallScroll Down:=-68
    Range("G2").Select
    Selection.AutoFill Destination:=Range("G2:G6"), Type:=xlFillDefault
    Range("G2:G6").Select
End Sub

混ぜたいものについている番号が「セル+1」なので、インプットボックスに入れた値に1を足したものをL1とL2に一度出すようにしています。
乱数表示している中で、開始と終わりを指定する際、D列の上からL1番目を開始、D列の上からL2番目を終わりにしたいです。
助言いただければ幸いです。

< 使用 Excel:Excel2016、使用 OS:unknown >


質問者です。
最後の方で違うこと書きました。

「混ぜたいものについているセル番号が、順番+1です。(2段目からスタートしています」
(ねろ) 2017/08/14(月) 13:09


 ちょっと、よく分からないです。

 シンプルなデータで、簡単なレイアウト図をアップできませんか?

(半平太) 2017/08/14(月) 13:54


半平太さん
お返事ありがとうございます。

能力不足で図のアップはできないです。申し訳ありません。
分かりにくくて恐縮ですが、言葉で説明を加えさせていただきます。

A列は、A1に「No.」A2以降、A3,A4…に番号が1,2,3…と振ってあります。
B列はそれに対応する名前がA2,A3,A4…に
1列あいてD列に =RAM() で乱数表示
E列は、E2に =RANK(D2,$D$5:$D$30) を入れてコピーで、乱数の順位付けをしています。
また1列あいてG列の、G2から下に、指定したA列についている番号の範囲の中で乱数の大きいものから持ってきたいです。

マクロでなく、マウスでコピーすればできるのですが、これ、マクロでできないでしょうか…

(ねろ) 2017/08/14(月) 15:34


 >=RANK(D2,$D$5:$D$30)
            ~~↑~
       ,$D$2 じゃないですか?

 マクロが必要なんですか?

 普通に下記数式を2行目から30行目までコピーすればいいんじゃないですか?

 ※29人分ですよね? 人数が都度変わって困る、とか言う問題なんでしょうか?

 (1) D2セル =RAND()
 (2) E2セル =RANK(D2,$D$2:$D$30)
 (3) G2セル =MATCH(30-ROW(A1),$E$2:$E$30,0)

  行  _A_  ___B___  _C_  ____D____  _E_  _F_  __G__
   1  No.                                     順番 
   2    1  name01         0.77779     3          4 
   3    2  name02        0.448748     7          2 
   4    3  name03        0.835582    12          7 

(半平太) 2017/08/14(月) 15:59


半平太さん

今は30で止まってるんですが、今後どんどん増えていって、数もその都度変わり頻繁に使うので、マクロがあったら便利だと思い質問させていただきました。

(ねろ) 2017/08/14(月) 16:47


 Sub Macro1()
     Dim ans As String
     Dim x, y, zz

     ans = InputBox("開始", "範囲指定")

     If ans <> "" Then
         Range("L1").Value = ans + 1
     End If

     ans = InputBox("終わり", "範囲指定")

     If ans <> "" Then
         Range("L2").Value = ans + 1
     End If

     x = Range("L1").Value  '開始行
     y = Range("L2").Value  '終了行
     zz = Abs(y - x) + 1    '件数

     '更地化
     Range("D2:E10000,G2:G10000").ClearContents

     With Cells(x, "D").Resize(zz)
         .Formula = "=RAND()"
         .Value = .Value  ’値化
     End With

     Cells(x, "E").Resize(zz).Formula = "=RANK(D" & x & ",$D$" & x & ":$D$" & y & ")"
     Cells(x, "G").Resize(zz).Formula = "=INDEX($A$" & x & ":$A$" & y & ",MATCH(ROW(A1),$E$" & x & ":$E$" & y & ",0))"
 End Sub

 <結果図>
  行 _A_ ___B___ _C_ ____D____ _E_ _F_ __G__ _H_ _I_ _J_ _K_ _L_
   1 No.                               順番                    4
   2   1 name01                                                9
   3   2 name02                                                 
   4   3 name03      0.451303    3        8                     
   5   4 name04      0.198446    5        7                     
   6   5 name05      0.041042    6        3                     
   7   6 name06      0.434827    4        6                     
   8   7 name07      0.461402    2        4                     
   9   8 name08      0.856341    1        5                     
  10   9 name09                                                 

(半平太) 2017/08/14(月) 17:41


>マクロがあったら便利だと思い質問させていただきました。
マウスで選択する必要あります?
「B列の2行目からデータの最終行まで」の名前データをシャッフルするのですよね?

じゃ、その手順のように順次自動で作業してもらえるようVBA語で書けばいいだけです。

Sub test()

    'B2セルからB列の最後のデータまでのセル範囲に対して
    With Application.Range(Range("B2"), Cells(Rows.Count, "B").End(xlUp))
        '1列右に数式入力
        .Offset(, 1).Formula = "=Rand()"
        '2列右に値転記
        .Offset(, 2).Value = .Value
        '範囲を2列分に拡張して右に1列ずらしたセル範囲を並び替え
        .Resize(, 2).Offset(, 1).Sort .Cells(1, 2)
        '1列右の列(数式を入れた列)をクリア
        .Offset(, 1).ClearContents
    End With
End Sub

ちなみに、元にしたマクロの記録が以下

Sub Macro2()
'
' Macro2 Macro
' マクロ記録日 : 2017/8/14 ユーザー名 : ma
'

'

    Range("C2:C4").Select
    Selection.FormulaR1C1 = "=RAND()"
    Range("B2:B4").Select
    Selection.Copy
    Range("D2").Select
    ActiveSheet.Paste
    Range("C2:D4").Select
    Application.CutCopyMode = False
    Selection.Sort Key1:=Range("C2"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin, DataOption1:=xlSortNormal
    Range("C2:C4").Select
    Selection.ClearContents
End Sub

あ、エクセル2003で記録しましたので、並び替えのコードがそれ以降のバージョンと
書き方が変わってますが、2003のコードでも動きます。
(まっつわん) 2017/08/14(月) 18:09


まっつわんさん

マクロを書いてくださりありがとうございます。

はじめから最後までではなく、開始も終わりも自由に設定したくてインプットボックスなど使って探っています。
(ねろ) 2017/08/14(月) 18:14


 >はじめから最後までではなく、
 >開始も終わりも自由に設定したくてインプットボックスなど使って探っています。
ほー、、、じゃ、飛び飛びはなしですか?
番号の何番から何番でいいのですか?

(まっつわん) 2017/08/14(月) 18:50


まっつわんさん

おっしゃる通りです。
とびとびは無いです。
半平太さんがかいてくださった図の、A列の何番から何番です。
(ねろ) 2017/08/14(月) 18:58


>おっしゃる通りです。
>とびとびは無いです。
なるほど、、、
で、コードを書けと?

行き当たりばったりで書いたから変なコードになったorz
入力時点で何番から何番までが選択できるかわかったほうが親切だなぁ。。。(きっと)

Sub test()

    Dim v As Variant
    Dim Rng As Range
    Dim i As Long

    v = InputBox("連番入力(例5-10)", "番号")
    If Len(v) = 0 Then Exit Sub                 'キャンセルなら終わり
    v = Split(v, "-")                           '文字をハイホンで分解
    If UBound(v) <> 1 Then Exit Sub             '分解した文字が2つ別れたか確認
    If IsNumeric(v(0)) = False Then Exit Sub    '分解した文字が数値として認識可能かチェック
    If IsNumeric(v(1)) = False Then Exit Sub
    '対象セル範囲の取得
    Set Rng = Application.Range(Range("B2"), Cells(Rows.Count, "B").End(xlUp))
    '番号が範囲内かチェック
    For i = 0 To 1
        If v(i) <= 0 Or v(i) > Rng.Count Then Exit Sub
    Next

    'B2セルからB列の最後のデータまでのセル範囲に対して
    With Application.Range(Range("B2"), Cells(Rows.Count, "B").End(xlUp))
        '指定のセル範囲の中で何番目のセルから何番目のセルまでにセル範囲を限定
        With Application.Range(.Cells(v(0)), .Cells(v(1)))
            '1列右に数式入力
            .Offset(, 1).Formula = "=Rand()"
            '2列右に値転記
            .Offset(, 2).Value = .Value
            '範囲を2列分に拡張して右に1列ずらしたセル範囲を並び替え
            .Resize(, 2).Offset(, 1).Sort .Cells(1, 2)
            '1列右の列(数式を入れた列)をクリア
            .Offset(, 1).ClearContents
        End With
    End With
End Sub

(まっつわん) 2017/08/15(火) 07:14


まっつわんさん

お手数おかけしました。
本当にありがとうございます!!
シャッフルできました。
RANKでなくてもよいのですね。

(ねろ) 2017/08/15(火) 09:38


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.