Excel VBA質問箱 IV

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

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


13350 / 13646 ツリー ←次へ | 前へ→

【5779】コンボボックスで未使用の番号を代入する方法 まこさん 03/5/30(金) 11:32 質問
【5794】Re:コンボボックスで未使用の番号を代入する... Kein 03/5/30(金) 23:40 回答
【5809】Re:コンボボックスで未使用の番号を代入する... まこさん 03/6/2(月) 11:12 お礼

【5779】コンボボックスで未使用の番号を代入する...
質問  まこさん  - 03/5/30(金) 11:32 -

引用なし
パスワード
   ご覧いただきありがとうございます。
下のような表がります。分類をcombobox1、番号をcombobox2に見立てます。
combobox1で選択した分類に従って未使用の番号を頭(1)から検索し使用していない番号をcombobox2に入れたいのですが、既使用番号が少なければいいのですが、何百もなると検索に時間がかかってしましまいます。何か良い方法があればご教授いただきたのですが。関数とかで探せればそれもいいのですが。ちなみに、私が現時点で考えたマクロを下段に載せています。よろしくお願いします。

(表)
分類 番号
1  1
1  2
1  3
2  1
2  3

※この表でいくと、COMBOBOX1で1を選択したら、自動で4がCOMBOBOX2に入り、COM1で2を選択したらCOM2に2が入るようにしたいのです。ただし、例えばAの既使用番号が500番まで埋まっていたりしたら検索に時間がかかってしまいます。以下は、私が現時点で作成したマクロです。

SUB MACRO()
BANGOU = 0
REPEAT1:
 GYOU = 1
 FLG = 0
 FLG2 = 0
 BANGOU = BANGOU + 1
 BANCHIA = "Sheet1!A" & GYOU
 DO UNTIL FLG = 9 OR FLG2 = 9
  IF RANGE(BANCHIA) = "" THEN
   FLG2 = 9
  ELSE
   IF RANGE(BANCHIA).VALUE > COMBOBOX1.VALUE THEN
    FLG2 = 9
   ELSE
    IF RANGE(BANCHIA).VALUE = COMBOBOX1.VALUE THEN
     BANCHIB = "Sheet1!B" & GYOU
     IF RANGE(BANCHIB).VALUE = BANGOU THEN
      FLG = 9
     END IF
    END IF
    IF FLG <> 9 THEN
     GYOU = GYOU + 1
     BANCHIA = "Sheet1!A" & GYOU
    END IF
   END IF
  END IF
 LOOP
 IF FLG2 = 9 THEN
  COMBOBOX9.VALUE = CSTR(BANGOU)
 ELSE
  IF FLG = 9 THEN
   GOTO REPEAT1
  ELSE
   COMBOBOX2.VALUE = CSTR(BANGOU)
  END IF
 END IF
END SUB


【5794】Re:コンボボックスで未使用の番号を代入す...
回答  Kein  - 03/5/30(金) 23:40 -

引用なし
パスワード
   速いかどうかは分かりませんが、分かりやすいコードとして・・

Sub Test()
  Dim FR As Range, FR2 As Range, MyR As Range
  Dim i As Long, Mx As Long, Mi As Long

  x = UserForm1.ComboBox1.Value
  With Sheets("Sheet1")
   Set FR = .Columns(1).Find(x, , xlValues, xlWhole)
   Set FR2 = .Columns(1).Find(x, , xlValues, , xlPrevious)
   Set MyR = .Range(FR, FR2).Offset(, 1)
  End With
  Mx = WorksheetFunction.Max(MyR)
  Mi = WorksheetFunction.Min(MyR)
  If Mx - (Mi - 1) = MyR.Cells.Count Then
   MsgBox "未使用の数値がありません", 64
  Else
   For i = Mi + 1 To Mx
     If IsError(Application.Match(i, MyR, 0)) Then
      Exit For
     End If
   Next i
   UserForm1.ComboBox2.AddItem i
  End If
  Set FR = Nothing: Set FR2 = Nothing: Set MyR = Nothing
End Sub
   
というのは、どうでしょーか ? 未使用の最小値が1つ入ります。

【5809】Re:コンボボックスで未使用の番号を代入す...
お礼  まこさん  - 03/6/2(月) 11:12 -

引用なし
パスワード
   ご回答いただきありがとうございます。
しかし、私の理解力がないせいか今のところ解決に至っておりません。
keinさんに教えていただいた分をもう少し自分自身じっくり見させていただき参考にさせていただきます。

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