こんにちは。
1) コマンドボタンを押した時に、
2) コンボボックス の入力状況が
1-4まで入力済である場合、
1-8まで入力済である場合、
1-12まで入力済である場合、
1-16まで入力済である場合、
以上の場合は入力済のデータをすべて出力
それ以外の場合は、
'「入力されていない項目があります」というメッセージ'
3) 出力先は 'アクティブシートの' B:E列 最下行 直下の空セル
ということで宜しいでしょうか?
〓以下、実際に作成したテスト用サンプルブックの概要です。 (オブジェクト名)
'ユーザーフォーム1' UserForm1
'横の4つのコンボボックス...のまとまり' 【1】
ComboBox1、ComboBox2、ComboBox3、ComboBox4
'横の4つのコンボボックス...のまとまり' 【2】
ComboBox5、ComboBox6、ComboBox7、ComboBox8
'横の4つのコンボボックス...のまとまり' 【3】
ComboBox9、ComboBox10、ComboBox11、ComboBox12
'横の4つのコンボボックス...のまとまり' 【4】
ComboBox13、ComboBox14、ComboBox15、ComboBox16
'コマンドボタンが1つ' CommandButton1
新規に追加挿入するクラスモジュール Class1
〓
一応、ご質問で例示されたオブジェクトに対して、
こちらでテスト用(動作確認用)に仮に付けた名前や条件設定、
をメモしておきました。
これだけ準備すれば、
仮に、私が提示するスクリプトをそちらでの実情に合わせて修正することが難しかったとしても、
新規のブックで簡単に内容(動作)を確認することが出来るようにと、という意図で書いています。
何れにしても、動かしてみた上で何かこちらの誤解があるようでしたらば、補足ください。
或いは、ComboBoxのオブジェクト名が順番通りに並んでいない状況への対策が必要な場合は、
'横の4つのコンボボックス...のまとまり' 4つ毎に、ComboBoxのオブジェクト名の対応を示してください。
そちらで確認しておいて欲しい技術的な要件は、
「Bit演算」「VBA クラスモジュール」などのキーワードで、調べてみて下さい。
'〓以下、上記条件で動作確認した、UserForm1 モジュールの記述内容です。
' ' === UserFormモジュール ===
Option Explicit
Private colClassCbx As New Collection
Private Const Filled1 = 15, Filled12 = 255, Filled123 = 4095, Filled1234 = 65535
Private nBit As Long
' ' = 以上、モジュール先頭、宣言部 =
Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 16
colClassCbx.Add New Class1, CStr(i)
colClassCbx(CStr(i)).IntClass Me.Controls("ComboBox" & i), 2 ^ (i - 1)
Next i
End Sub
Private Sub CommandButton1_Click()
Dim nRowPos As Long
Dim i As Long
Select Case nBit
Case Filled1, Filled12, Filled123, Filled1234
nRowPos = Cells(Rows.Count, "B").End(xlUp).Row + 1
With Cells(nRowPos, "B").Resize(4, 4)
' For i = 1 To Int(Log(nBit) / Log(2)) + 1
For i = 1 To Log(nBit) / Log(2)
.Cells(i) = colClassCbx(CStr(i)).Value
Next i
End With
Case Else
MsgBox "入力されていない項目があります"
End Select
End Sub
Public Sub RcvCbx(ByVal nCbxIdx As Long, ByVal IsNull As Boolean)
If IsNull Then
nBit = nBit Xor nCbxIdx And IsNull
Else
nBit = nBit Or nCbxIdx
End If
' Debug.Print nBit
End Sub
' ' =================
'〓以下、上記条件で動作確認した、Class1 モジュールの記述内容です。
' ' === Class モジュール ==== (オブジェクト名) = Class1
Option Explicit
Private WithEvents cbxEv As MSForms.ComboBox
Private myValue
Private nBit As Long
' ' = 以上、モジュール先頭、宣言部 =
Public Sub IntClass(ByVal cbx As MSForms.ComboBox, ByVal n As Long)
Set cbxEv = cbx
nBit = n
End Sub
Private Sub cbxEv_Change()
UserForm1.RcvCbx nBit, (cbxEv.ListIndex < 0)
Value = cbxEv.Value
End Sub
Public Property Let Value(v)
myValue = v
End Property
Public Property Get Value()
Value = myValue
End Property
' ' =================