プロが教える店舗&オフィスのセキュリティ対策術

VBAユーザーフォーム作成の上記エラーについて
VBA初心者です。
初心者ですので、本を見ながら作成していましたが、その通り作成したつもりがエラー表示が・・
シート上にユーザーフォームは出てくるようにして入力をしているのですが、ボタン(更新、追加、削除)やスピン移動をクリックすると「コンパイルエラー SubまたはFunctionが定義されていません」とでてきます。本の通りしたので何が悪かったのかよくわからなくなりました。
下記に本を見て作ったコードを書きますので教えて頂きたいです。素人すぎますので説明不足もありますが宜しくお願いします。

Private Sub Button更新_Click()
データ書き込み (Spin移動.Value)

End Sub

Private Sub Button削除_Click()

データ範囲.Rows(Spin移動.Value).Delete
データ表示 (Spin移動.Value)

Set データ範囲 = Range("A1").CurrentRegion
Spin移動.Max = データ範囲.Rows.Count

End Sub

Private Sub Button終了_Click()
患者様データ.Hide

End Sub

Private Sub Button追加_Click()

Dim AddRow As Integer
AddRow = データ範囲.Rows.Count + 1  
データ書き込み (AddRow)




Textレコード.Text = Spin移動.Value - 1 & "/" & レコード数取得
Set データ範囲 = Range("A1").CurrentRegion
Spin移動.Max = データ範囲.Rows.Count
Spin移動.Value = データ範囲.Rows.Count
データ表示 (AddRow)


End Sub

Private Sub MultiPage1_Change()

End Sub

Private Sub Option女_Click()

End Sub

Private Sub Option男_Click()

End Sub

Private Sub Spin移動_Change()
If データ範囲.Rows.Count <> 1 Then
データ表示 (Spin移動.Value)
End If



End Sub


Private Sub TextIIIIV音_Change()

End Sub

Private Sub Text患者ID_Change()

End Sub



Private Sub Text生年月日_AfterUpdate()
Text年齢.Value = DateDiff("yyyy", Text生年月日.Value, Now())

End Sub



Private Sub UserForm_Initialize()

Dim TBL(1 To 9) As Control
Dim データ範囲 As Range


Combo診療科.ColumnCount = 1
Combo診療科.AddItem "内科"
Combo診療科.AddItem "外科"
Combo診療科.AddItem "小児科"

Combo主治医.ColumnCount = 1
Combo主治医.AddItem "今中尚子"
Combo主治医.AddItem "岡井康葉"



Set TBL(1) = Text患者ID
Set TBL(2) = Text氏名
Set TBL(3) = Text生年月日
Set TBL(4) = Frame性別
Set TBL(5) = Combo診療科
Set TBL(6) = Combo主治医
Set TBL(7) = Text入院日
Set TBL(8) = Text退院日
Set TBL(9) = Combo指導医

Set データ範囲 = Range("A1").CurrentRegion
Spin移動.Max = レコード数取得 + 1
If データ範囲.Rows.Count = 1 Then
Else
データ表示 2
End If


End Sub

Public Sub データ表示(行数 As Integer)

Dim Cnt As Integer
For Cnt = 1 To 9
Select Case Cnt
Case 4
If データ範囲.Cells(行数, Cnt).Value = "男" Then
Option男.Value = True
Else
Option女.Value = True
End If
Case Else
Dim S
For Cnt = 1 To 9
S = データ範囲cells(行数, Cnt).Value
Next






End Select
Next

If IsDate(Text生年月日.Text) Then
Text年齢.Value = DateDiff("yyyy", Text生年月日.Value, Now())
Else
Text年齢.Value = Null
End If
Textレコード.Value = Spin移動.Value - 1 & "/" & レコード数取得

End Sub

Public Sub データ書き込み(行数 As Integer)
Dim Cnt As Integer
For Cnt = 1 To 9
Select Case Cnt
Case 4
If Option男.Value = True Then
データ範囲.Cells(行数, Cnt).Value = "男"
Else
データ範囲.Cells(行数, Cnt).Value = "女"
End If
Case Else
データ範囲.Cells(行数, Cnt).Value = TBL(Cnt).Value ←このTBLの部分で青くなり上記エラー
End Select
Next

End Sub

Public Function レコード数取得() As Integer
レコード数取得 = Range("A1").CurrentRegion.Rows.Count - 1


End Function

A 回答 (1件)

変数の使い方が間違っています。



変数は、それを定義したSubまたはFunctionの中でしか有効ではありません。

このプログラムで言えば、
Private Sub UserForm_Initialize()
Dim TBL(1 To 9) As Control
Dim データ範囲 As Range
・・・・
End Sub
なので、TBLやデータ範囲の変数が使えるのは Sub UserForm_Initialize の中だけです。

どうしてもUserForm_Initializeの外で使いたいなら、
パブリック変数にする必要があります。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございました。

お礼日時:2012/03/19 10:07

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