[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『組合せのマクロをお願いします』(中川)
お世話になっております。
A列に、0〜9の中からランダムに0〜5個の数字
B列に、0〜9の中からランダムに0〜5個の数字
C列に、0〜9の中からランダムに0〜5個の数字
D列に、0〜9の中からランダムに0〜5個の数字
が記載されているとします。
A列…5,9
B列…2,3,8
C列…なし
D列…0,1,4,7
といった感じです。数字の重複はありません。
6が入っておりませんが、欠けている数字もあります。
F列に、この中から組合せで3桁の数字を出したく思っています。
同じ列内からは重ならないように、つまり上の例ですと、A列からは5か9かどちらかで、5と9両方は入らないようにしたいです。
場合によってはA〜Dの数字が合計3個に満たない場合もありますが、それは出来上がった組合せ数字を羅列する場所(F列)が空白になるものとして処理したいです。
また、3桁は小さい順に並べられているとありがたいです。(534ではなく345に)
関数でなんとかしようとしたのですが挫折しました。
マクロのご教授をいただけますか。(関数の方が助かりますが、おそらく難しいですよね)
どうかよろしくお願い致します。
< 使用 Excel:Excel2010、使用 OS:Windows8 >
0が頭にくるものは3桁と認めるのか認めないのかどちらだろうか? (結果を文字列の数字とするのか数値とするのか) (ねむねむ) 2015/07/02(木) 09:08
あ、でも頭が0を認めないとすると >3桁は小さい順に並べられているとありがたいです。 とぶつかって「0」が使えなくなるか。 (0は必ず先頭になるため) (ねむねむ) 2015/07/02(木) 09:17
(γ) 2015/07/02(木) 20:22
トライしてみました。 余り念入りにテストしていないので、間違っていたら失礼。
Dim dic1 As Object Dim dic2 As Object Dim p As Long
Sub test() Dim i As Long, j As Long, k As Long Dim s As String
p = 0
'A〜D列のデータを辞書 dic1 に格納 Call dataset
' 書き込み先の初期化 Sheet1.Columns("F").NumberFormatLocal = "@" Sheet1.Columns("F:G").ClearContents
Set dic2 = CreateObject("Scripting.Dictionary")
' すべての組み合わせを作って、チェックし、合格したものを書き出す For i = 0 To 7 For j = i + 1 To 8 For k = j + 1 To 9 s = CStr(i) & CStr(j) & CStr(k) If check(s) Then p = p + 1 Sheet1.Cells(p, "F").Value = s Sheet1.Cells(p, "G").Value = CLng(s) End If Next Next Next End Sub
Sub dataset() Dim k As Long Dim j As Long Dim s As String
Set dic1 = CreateObject("Scripting.Dictionary") For k = 1 To 4 For j = 1 To Sheet1.Cells(Rows.Count, k).End(xlUp).Row s = Sheet1.Cells(j, k).Text If Len(s) > 0 Then dic1(s) = k End If Next Next End Sub
Function check(s As String) As Boolean Dim k As Long Dim ss As String Dim box As String
dic2.RemoveAll
For k = 1 To Len(s) ss = Mid(s, k, 1) If dic1.exists(ss) Then box = CStr(dic1(ss)) If dic2.exists(box) Then Exit Function Else dic2(box) = Empty End If Else Exit Function End If Next check = True
End Function
(γ) 2015/07/02(木) 20:36
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.