プロが教えるわが家の防犯対策術!

仕事上システムを作り始めたVBA初心者です。すみませんが、ご享受下さい。

ユーザーフォームにてチェックボックスを作成後、セルへ転載するものを作っております。
その中でチェックボックスが15個ほどあり、onの場合にはその行の25列目に"有"、OFFの場合は"無"と表示させたいのです。

現状はTRUEといった表示はされるところまではいったのですが、その先がどうしてもできません。

見よう見まねで始めた初心者ですので、コードもどこが必要かもあまりわからないのが現状です。お答え頂く上で必要であればアップしますので、よろしくお願い致します。尚、作ろうとしてるのはデータベースで設備項目に有、無をつける予定です。

A 回答 (3件)

>Cells(GYO, 25).Value = (.CheckBox1.Value) 'チェックボックス*



単純には、
If .CheckBox1.Value Then
Cells(GYO, 25).Value = "有"
Else
Cells(GYO, 25).Value = "無"
End If
のようにIF文で判断して記入するだけです。
「15個のチェックボックス」と書かれていましたが、個別に値を参照して記入するのでしょうか?
それとも、15個のうち1個でもチェックが付いて居れば・・・と判断するのでしょうか?

Private Sub CheckBox1_Click()
End Sub
のプロシージャは削除してかまいません。
チェックボックスがクリックされた時に何らかの処理が必要な場合を除いて通常は使う事はありません。


複数のコントロールをまとめて処理する方法があります。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …

-------ざっと修正(予想も含めて)して見ました。
不具合等はご自身で修正してください。

Public g_swOK As Byte ' フォームで登録が押されたかを判定するスイッチ

' ユーザー情報の登録処理
Public Sub TOUROKU(GYO As Long)
Dim i As Integer

' 現在選択行を取得
GYO = ActiveCell.Row
' ユーザー情報の登録のフォームを表示
Load UserForm2

With UserForm2
If ((GYO = 1) Or (Cells(GYO, 1).Value = "")) Then
' 見出しか未登録行の場合は新規登録と判断
GYO = 0
For i = 1 To 25
.Controls("TextBox" & i).Text = ""
Next

Else
' 既存行の場合は修正と判断
For i = 1 To 35
If i <= 3 Then
.Controls("TextBox" & i).Value = Cells(GYO, i).Value
ElseIf i <= 8 Then
.Controls("TextBox" & i).Value = Cells(GYO, i + 1).Value
ElseIf i <= 24 Then
.Controls("TextBox" & i).Value = Cells(GYO, i + 2).Value
Else
.Controls("TextBox" & i).Value = Cells(GYO, i + 16).Value
End If
Next


For i = 1 To 15
If Cells(GYO, 25).Value = "有" Then
.Controls("CheckBox" & i).Value = True
Else
.Controls("CheckBox" & i).Value = False
End If

.ComboBox1.Text = Cells(GYO, 4).Value
.ComboBox2.Text = Cells(GYO, 9).Value

End If


' フォームを表示
g_swOK = 0
.Show
' 登録ボタンが押されていない場合は以降の処理はしない
If g_swOK <> 1 Then GoTo TOUROKU_EXIT
' 新規登録の場合は未登録行を探す
If GYO = 0 Then
GYO = 2
' 氏名列未登録を判定
Do While Cells(GYO, 1).Value <> ""
GYO = GYO + 1
Loop
End If

' シート上に登録
ActiveSheet.Unprotect

For i = 1 To 35
If i <= 3 Then
Cells(GYO, i).Value = Trim(.Controls("TextBox" & i).Value)
ElseIf i <= 8 Then
Cells(GYO, i + 1).Value = Trim(.Controls("TextBox" & i).Value)
ElseIf i <= 24 Then
Cells(GYO, i + 2).Value = Trim(.Controls("TextBox" & i).Value)
Else
Cells(GYO, i + 16).Value = Trim(.Controls("TextBox" & i).Value)
End If
Next

For i = 1 To 15
If .Controls("CheckBox" & i).Value Then
Cells(GYO, i + 25).Value = "有"
Else
Cells(GYO, i + 25).Value = "無"
End If
Next

Cells(GYO, 4).Value = Trim(.ComboBox1.Text)
Cells(GYO, 9).Value = Trim(.ComboBox2.Text)

ActiveSheet.Protect

End With


' オブジェクト廃棄のための行ラベル
TOUROKU_EXIT:
' FRM_USERをアンロードしオブジェクトを解放
Unload UserForm2
Set UserForm2 = Nothing

End Sub
    • good
    • 0
この回答へのお礼

検証させて頂いた結果、思った通りの内容が得られました。ご丁寧にいろいろ教えて下さり、大変感謝しております。また何か質問させて頂くこともあるかもしれませんが、その際はよろしくお願い致します。

お礼日時:2008/11/26 11:59

間違えました


-----------------
For i = 1 To 15
If .Controls("CheckBox" & i).Value Then
Cells(GYO, i + 25).Value = "有"
Else
Cells(GYO, i + 25).Value = "無"
End If
Next
----------------

For i = 1 To 15
If .Controls("CheckBox" & i).Value Then
Cells(GYO, i + 24).Value = "有"
Else
Cells(GYO, i + 24).Value = "無"
End If
Next

---------------
For i = 1 To 15
If .Controls("CheckBox" & i).Value Then
Cells(GYO, i + 25).Value = "有"
Else
Cells(GYO, i + 25).Value = "無"
End If
Next
------------------

For i = 1 To 15
If .Controls("CheckBox" & i).Value Then
Cells(GYO, i + 24).Value = "有"
Else
Cells(GYO, i + 24).Value = "無"
End If
Next
としてください。
([25]を[24]とするだけ)
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
検証後に再度ご連絡いたします。

お礼日時:2008/11/25 12:49

>現状はTRUEといった表示はされるところまではいったのですが、その先がどうしてもできません。



だいたいの想像は出来ますが、コードを提示して頂く方がよりよい回答を得られると思います。

Teue/False をIF文で判断して、"有"/"無"の文字としてセルに記入するのが通常かと思います。

この回答への補足

Option Explicit

Public g_swOK As Byte ' フォームで登録が押されたかを判定するスイッチ

' ユーザー情報の登録処理
Public Sub TOUROKU(GYO As Long)

' 現在選択行を取得
GYO = ActiveCell.Row
' ユーザー情報の登録のフォームを表示
Load UserForm2
With UserForm2
If ((GYO = 1) Or (Cells(GYO, 1).Value = "")) Then
' 見出しか未登録行の場合は新規登録と判断
GYO = 0
.TextBox1.Text = ""
.TextBox2.Text = ""
.TextBox3.Text = ""
    -中略-
.TextBox23.Text = ""
.TextBox24.Text = ""
.TextBox25.Text = ""

Else
' 既存行の場合は修正と判断
.TextBox1.Text = Cells(GYO, 1).Value ' 氏名
.TextBox2.Text = Cells(GYO, 2).Value ' 社員No.
.TextBox3.Text = Cells(GYO, 3).Value ' 部署
.TextBox4.Text = Cells(GYO, 5).Value
.TextBox5.Text = Cells(GYO, 6).Value
      -中略-
.TextBox27.Text = Cells(GYO, 43).Value
.TextBox28.Text = Cells(GYO, 44).Value
.TextBox29.Text = Cells(GYO, 47).Value
.TextBox33.Text = Cells(GYO, 45).Value
.TextBox34.Text = Cells(GYO, 50).Value
.TextBox35.Text = Cells(GYO, 52).Value

.CheckBox1.Value = Cells(GYO, 25).Value
.ComboBox1.Text = Cells(GYO, 4).Value
.ComboBox2.Text = Cells(GYO, 9).Value

End If


' フォームを表示
g_swOK = 0
.Show
' 登録ボタンが押されていない場合は以降の処理はしない
If g_swOK <> 1 Then GoTo TOUROKU_EXIT
' 新規登録の場合は未登録行を探す
If GYO = 0 Then
GYO = 2
' 氏名列未登録を判定
Do While Cells(GYO, 1).Value <> ""
GYO = GYO + 1
Loop
End If
' シート上に登録
ActiveSheet.Unprotect
Cells(GYO, 1).Value = Trim$(.TextBox1.Text) '
Cells(GYO, 2).Value = Trim$(.TextBox2.Text) '
Cells(GYO, 3).Value = Trim$(.TextBox3.Text) '
Cells(GYO, 5).Value = Trim$(.TextBox4.Text)
Cells(GYO, 6).Value = Trim$(.TextBox5.Text)
        -中略-
Cells(GYO, 43).Value = Trim$(.TextBox27.Text)
Cells(GYO, 44).Value = Trim$(.TextBox28.Text)
Cells(GYO, 47).Value = Trim$(.TextBox29.Text)
Cells(GYO, 45).Value = Trim$(.TextBox33.Text)
Cells(GYO, 50).Value = Trim$(.TextBox34.Text)
Cells(GYO, 52).Value = Trim$(.TextBox35.Text)

Cells(GYO, 25).Value = (.CheckBox1.Value) 'チェックボックス*
Cells(GYO, 4).Value = Trim$(.ComboBox1.Text)
Cells(GYO, 9).Value = Trim$(.ComboBox2.Text)

ActiveSheet.Protect

End With


' オブジェクト廃棄のための行ラベル
TOUROKU_EXIT:
' FRM_USERをアンロードしオブジェクトを解放
Unload UserForm2
Set UserForm2 = Nothing
End Sub

これがモジュール1の内容です。チェックボックス1がTrueの場合にgyo,25に"有"と入れたいです。

これでわかりますでしょうか・・。

ちなみにチェックボックスは下記のように空白になっています。
何を入れてもエラーがでてしまうので・・。

Private Sub CheckBox1_Click()

End Sub

補足日時:2008/11/24 16:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!