Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5695 / 13645 ツリー ←次へ | 前へ→

【49396】重複チェックがよくわかりません マイス 07/6/3(日) 21:49 質問[未読]
【49398】Re:重複チェックがよくわかりません Kein 07/6/3(日) 22:53 回答[未読]
【49399】Re:重複チェックがよくわかりません Hirofumi 07/6/3(日) 23:35 回答[未読]
【49402】Re:重複チェックがよくわかりません Hirofumi 07/6/4(月) 10:32 回答[未読]
【49421】Re:重複チェックがよくわかりません マイス 07/6/4(月) 21:31 お礼[未読]

【49396】重複チェックがよくわかりません
質問  マイス  - 07/6/3(日) 21:49 -

引用なし
パスワード
   Item(1)〜Item(4)の数字の重複を防ぎたいのですが、
どうすればよいかわかりません。
教えてください<(__)>
おねがいします。

Option Explicit
Option Base 1
Sub 乱数A1()
Dim a As Integer, b As Integer
Dim c As Integer, d As Integer, e As Integer
Dim GYO As Integer, Item() As String, X As Long
Cells.ClearContents
Randomize
a = 1  '乱数の下限
b = 5  '乱数の上限
c = 4  '乱数から取出す個数
d = 0  '空白のセル数
e = 1  '左からの列数
ReDim Item(c)
Item(1) = Int(Rnd * (b - a + 1) + 1)
Item(2) = Int(Rnd * (b - a + 1) + 1)
Item(3) = Int(Rnd * (b - a + 1) + 1)
Item(4) = Int(Rnd * (b - a + 1) + 1)
For X = 1 To c
  GYO = X + d
  Cells(GYO, e).Value = Item(X)
Next X
End Sub

【49398】Re:重複チェックがよくわかりません
回答  Kein  - 07/6/3(日) 22:53 -

引用なし
パスワード
   変数名に Item などは使わない方がいいです。
いちばん簡潔なコードで済むのは Dictionaryオブジェクト を使う方法ですが
それは誰かがレスしてくれるでしょう。
で、例えば Match関数 で重複チェックをする方法なら・・

Sub 乱数A1()
  Dim a As Integer, b As Integer
  Dim c As Integer, d As Integer, e As Integer
  Dim i As Integer, MyV As Integer
  Dim RAry() As String
  Dim MyAry As Variant
   
  Cells.ClearContents
  a = 1  '乱数の下限
  b = 5  '乱数の上限
  c = 4  '乱数から取出す個数
  d = 0  '空白のセル数
  e = 1  '左からの列数
  If c > b - a + 1 Then Exit Sub
  ReDim RAry(c): RAry(0) = a - 1
  For i = 1 To c
   Do
     Randomize
     MyV = Int((b - a) * Rnd + a)
   Loop Until IsError(Application.Match(CStr(MyV), RAry, 0))
   RAry(i) = CStr(MyV)
  Next i
  MyAry = Filter(RAry, CStr(a - 1), False)
  Cells(d + 1, e).Resize(c).Value = _
  WorksheetFunction.Transpose(MyAry)
  Erase RAry, MyAry
End Sub

* Option Base 1 は削除して下さい。

【49399】Re:重複チェックがよくわかりません
回答  Hirofumi  - 07/6/3(日) 23:35 -

引用なし
パスワード
   こんなかな?

Option Explicit

Public Sub Sample()

  '◆乱数の上限値
  Const clngUpper As Long = 5
  '◆乱数の下限値
  Const clngLower As Long = 1
  '◆取り出す個数
  Const clngNumber As Long = 4
  '◆出力先頭行位置
  Const clngRow As Long = 1
  '◆出力先頭列
  Const clngColumn As Long = 1
  
  Dim i As Long
  Dim lngCount As Long
  Dim lngRows As Long
  Dim rngResult As Range
  Dim lngData(1 To clngNumber, 1 To 1) As Long
  Dim lngMark As Long
  Dim strProm As String

  '出力Listの先頭セル位置
  Set rngResult = ActiveSheet.Cells(clngRow, clngColumn)
  rngResult.EntireColumn.ClearContents
  
  Randomize
  Do
    '乱数を発生
    lngMark = Int((clngUpper - clngLower + 1) * Rnd + clngLower)
    '配列に乱数が重複しているか確認
    For i = 1 To lngCount
      If lngData(i, 1) = lngMark Then
        Exit For
      End If
    Next i
    '重複が無いなら
    If i > lngCount Then
      '発生した乱数を配列に代入
      lngCount = lngCount + 1
      lngData(lngCount, 1) = lngMark
    End If
  '代入した個数が指定個数になるまで繰り返し
  Loop Until lngCount = clngNumber
  
  '出力
  rngResult.Resize(clngNumber).Value = lngData
  
  strProm = "処理が完了しました"
   
Wayout:

  
  Set rngResult = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

【49402】Re:重複チェックがよくわかりません
回答  Hirofumi  - 07/6/4(月) 10:32 -

引用なし
パスワード
   以下の4行を追加して下さい

  Dim strProm As String

  '★追加 以下4行
  If clngUpper - clngLower + 1 < clngNumber Then
    strProm = "振り出せる数が振り出す数より少ないので無限Loopに成ります"
    GoTo Wayout
  End If
  
  '出力Listの先頭セル位置
  Set rngResult = ActiveSheet.Cells(clngRow, clngColumn)

【49421】Re:重複チェックがよくわかりません
お礼  マイス  - 07/6/4(月) 21:31 -

引用なし
パスワード
   keinさん、Hirofumiさん、本当に有難う御座いました。

配列を覚えたばかりの私には、びっくりするぐらい高度に思えました。(笑)
色々調べながら、理解できるよう努めさせて頂きます。

とても良いお手本を有難う御座いました<(__)>

5695 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free