dポイントプレゼントキャンペーン実施中!

OKWebをはじめ、インターネットで質問をするのは、はじめてです。よろしくお願いします。
1ヶ月前から、年甲斐もなく老体に(66)鞭打ってVBAに挑戦しています。
開発をしているソフトは、ある組織の個人用の出納簿で、EXCELを知らなっくても、パソコンが少し触れるかたげ使用できる様にと思い取り組んでいます。
現在、ワークシート=3枚、ユーザフォーム=7枚、標準モジュール=4モジュールの作成を終えましたが、動作確認において、表題のエラーが出て、対応に苦労しています。
質問にあたり再現プログラムを作りましたから、ご指導よろしくお願いします。なお、開発環境は、WindowsXP、EXCEL2003です。

Sheet1 ⇒ 何も設定していません。
fom出納簿入力 ⇒ 作成済みのUserFormをインストールしました。
 ⇒⇒ 新たにUserFormを定義すると正常に動作します。

<<ThisWorkbook>>の定義内容
Private Sub Workbook_Open()
'--------<<タイトルバーの変更>>
Application.Caption = "○○システム"
ActiveWindow.Caption = "△△△"
'--------<<ウィンドウの枠の最大化>>
Application.WindowState = xlMaximized
ActiveWindow.WindowState = xlMaximized
'--------<<メニューバーのカスタマイズ>>
subメニューバーカスタマイズ
'--------<<ツールバーの非表示
Dim myCB As CommandBar
On Error Resume Next
For Each myCB In Application.CommandBars
myCB.Visible = False
Next myCB
On Error GoTo 0
End Sub

Sub subメニューバーカスタマイズ()
Dim myCB As CommandBar, myCBCtrl As CommandBarControl
'「ワークシートメニューバー」のすべてのコントロールを削除する
Set myCB = Application.CommandBars("Worksheet Menu Bar")
For Each myCBCtrl In myCB.Controls
myCBCtrl.Delete
Next myCBCtrl
'-----[出納簿]メニューの作成 -----
Set myCBCtrl = myCB.Controls.Add(Type:=msoControlPopup)
myCBCtrl.Caption = "出納簿"
'-----[出納簿]→[出納簿(入力)]メニューの作成 -----
Set myCBCtrl = myCB.Controls("出納簿").Controls.Add(Type:=msoControlButton)
myCBCtrl.Caption = "出納簿(入力)"
myCBCtrl.OnAction = "sub出納簿入力" 'モジュール「サブルーチン」
End Sub
(ThisWorkbookの定義は、内容をあまり理解せぬまま、参考書のサブルーチンを借用して、作成しました。)

<<Module1>>の定義内容
Sub sub出納簿入力()
Sheet1.Select
ActiveWindow.Zoom = 125
UserForms("fom出納簿入力").Show
End Sub

エラーは、最後の「UserForms("fom出納簿入力").Show」で発生しています。
また、「入力」に対して「訂正」ルーチンを組んでいます。訂正を行う場合は、まず、InputBoxメソード対話型プロセジャーを使って、訂正行を取得します。そして、データベースの該当行の内容を「訂正」UserFormsに表示するために、プロパティに設定する場合にも、「実行時エラー"13" 型が一致しません。」となります。
コーディングの一部は次のとおりです。

 my収入 = ActiveCell.Value ⇒ データベースから値を取得
 fom出納簿訂正.cb金額.Value = my収入

上記2命令の間でmsgboxでmy収入の値を確認していますが、正しく設定されています。訂正ルーチンは3個ありますが、1個は上記のコーディングで正しく動作しますが、2個がエラーとなります。

何分VBAの素人ですから、具体的なご指導を賜れば幸いです。

A 回答 (5件)

ANo.5です。



>uf出納簿訂正.cb月.Value = my月  ← ここでエラー
cd月ってどのコントロールなのでしょう。
TextBox?Label?
Label1.Caption = my月
TextBox1.Value = my月
TextBoxなら問題なさそうですが、LabelならValueではダメですし。
ようはプロパティでValueが使えないコントロールなのでしょう。
    • good
    • 0
この回答へのお礼

n-junさん

cb月は、uf出納簿訂正(ユーザフォーム)上にコンボボックスで定義しています。そして、Stylプロパティで「fmStyleDownList(値=2)を設定していました。これを、「fmStyleDownCombo(値=0)に変更すると、バグ吸収しました。
他の更新ルーチンでは、うまく動作していたので、テキストボックに設定するmy内容、My備考の設定をmy月、my日の前に移すと正常に動作したため、ユーザフォームの作り方ではなく、コントロールの違いの問題と判断して、個々のコントロールの設定内容を確認した所、バグ原因にたどり着きました。

今回、n-junさんには、Withステートメントの使い方、Debugオブジェクトの使用方法など、非常に参考となるご指示を頂き、ありがとうございました。
Withステートメントについては、一部使用していたのですが、コマンドと組み合わせた使い方を教えていただき、プログラムに見直し時に訂正をかけて、見やすいプログラムにしたいと思います。
また、Debugオブジェクトについても、その使い方について参考書を、今一度、見直しを行い、今後使用していきたいと思います。

VBAでのプログラム作成は、適当に部品(サブルーチン)を組み合わせれば、簡単に作成できるものと考えてプログラム作成に挑戦しました。が、40数年前にアッセンブラでプログラムを組んで以来の作業であり、ロジックは組めても、なかなかコーディングができません。参考書を読んでいる時は、このルーチンが使えると思っていても、いざコーディングになると、再び参考書をひっくり返すことになり、なかなか新しいルーチンのコーディングには時間がかかります。でも、40数年前のプログラム開発を考えると非常に楽ですね。40数年前は、コーディングの後の紙カードのパンチ作業が大変でしたが、VBAは、参考情報まで見せてくれますから、非常に楽ですね。

この後、出納簿などの月計、決算報告資料の作成に取り掛かりますが、また、今回の様な事態になった時には、よろしくお願いします。
ありがとうございました。

お礼日時:2008/09/16 11:48

ANo.3です。


直接の回答ではないですが。

Cells(my訂正行, 1).Activate ~ my支出 = ActiveCell.Value
までは、

With Cells(my訂正行, 1) 'my訂正行は、引継情報
     my年月日 = .Value
     my月 = Month(my年月日)
     my日 = Day(my年月日)
     my科目 = .Offset(0, 1).Value
     my細科目 = .Offset(0, 2).Value
     my領収書 = .Offset(0, 3).Value
     my内容 = .Offset(0, 4).Value
     my備考 = .Offset(0, 5).Value
     my収入 = .Offset(0, 6).Value
     my支出 = .Offset(0, 7).Value
End With
こんな感じでもいいのでは。

この回答への補足

n-junさん & bin-chanさん。

お二人のご指導により、次のとおり修正しました。また、ユーザフォームに問題があるのではないかと考え、再作成して組み込みました。ユーザフォーム名は、「uf出納簿訂正」に変更しました。

イミティエイトウィンドウには、日付とTrueが表示されましたが、やはりエラーとなりました。
エラーコードは、「実行時エラー”380” Valueプロパティを設定できません。プロパティの値が無効です。」に変わりました。ご指導よろしくお願いします。

Sub sub出納簿訂正データ編集()

Dim my年 As Integer
Dim my月 As Integer
Dim my日 As Integer
Dim my年月日 As Date
Dim my科目 As String
Dim my細科目 As String
Dim my領収書 As String
Dim my内容 As String
Dim my備考 As String
Dim my収入 As Long
Dim my支出 As Long
Dim my金額 As Long

With Cells(my訂正行, 1) 'my訂正行は、引継情報
my年月日 = .Value: Debug.Print my年月日, IsDate(my年月日)
my月 = Month(my年月日)
my日 = Day(my年月日)
my科目 = .Offset(0, 1).Value
my細科目 = .Offset(0, 2).Value
my領収書 = .Offset(0, 3).Value
my内容 = .Offset(0, 4).Value
my備考 = .Offset(0, 5).Value
my収入 = .Offset(0, 6).Value
my支出 = .Offset(0, 7).Value
End With

uf出納簿訂正.cb月.Value = my月  ← ここでエラー
uf出納簿訂正.cb日.Value = my日
uf出納簿訂正.cb科目.Value = my科目
uf出納簿訂正.cb細科目.Value = my細科目

If my領収書 = "有" Then
uf出納簿訂正.cb領収書有.Value = True
End If

uf出納簿訂正.cb内容.Value = my内容
uf出納簿訂正.cb備考.Value = my備考

If my科目 = "収入" Then
uf出納簿訂正.cb金額.Value = my収入
Else
uf出納簿訂正.cb金額.Value = my支出
End If

End Sub

補足日時:2008/09/15 23:50
    • good
    • 0
この回答へのお礼

n-junさん & bin-chanさん。

お二人のご協力いただき、先週の木曜日から頭を抱えていた問題が解決しました。インターネットで色々調べて、バグ対応でユーザフォームをいじっている時、よく「パスが違う」のようなエラーメッセージが出るため、ユーザフォームの作成の問題があると思い、何度も同じことを行っていました。手に負えなくなり、はじめてOWWebで質問をさせていただきました。(OKWebの仕組みが分からず、同じ質問を2度送信するなと、ご迷惑をかけることが多くありましたが、おゆるしください。)

結果的に今回のバグ原因は、コンボボックス(スタイル)の使用方法の問題でした。データベースのキーとなる項目については、「リストからの選択のみ可能」に設定していたためで、Styleプロパティの値を「2」から「0」に変更するとバグの箇所を抜けました。
訂正項目の表示と訂正操作時の使用方法について、今一度、仕様を見直したいと思います。

これから先、月計、年度末資料の作成、印刷と、参考書とインターネットで学びつつ作成しようと思っています。完成までには、今回のように息詰まることが多々あると思いますが、その節は、ご指導よろしくお願いします。ありがとうございました。

お礼日時:2008/09/16 06:07

#1です。



> Dim my収入 As Integer
> Dim my支出 As Integer
> Dim my金額 As Integer
32767を越えるとエラーになっている、なんでしょうね。

IntegerをLongに変更してください。2億円くらいまで大丈夫です。

この回答への補足

bin-chanさん、そして、n-junさん
ご指導ありがとうございます。

どうも、出納簿、台帳、名簿に対して同じルーチンを組んでおり、コーディングの際に、コピー操作を行っているために、若干、混乱しています。
今から、お二人のご指示を受けて、今一度、全体的に見直しをしてみたいと思います。閣下については、ANo5でご報告させていただきます。その節はよろしくお願いします。

補足日時:2008/09/15 21:35
    • good
    • 0

my年月日 = ActiveCell.Value: Debug.Print my年月日, IsDate(my年月日)


としてみて、イミディエイトウィンドウに何が表示されるのか?
アクティブセルが”日付”と認識できる物であれば、
セルの日付と"TRUE"と表示されるはずです。

そうでない場合アクティブセルが意図しない位置にあるのでしょう。

イミディエイトウィンドウはVBE画面のツールバーで
表示>イミディエイトウィンドウです。

この回答への補足

n-junさん
早速、回答を頂きありがとうございます。

イミディエイトウィンドウは使用したことがないので、ご指導に従って今夜取り組んでみたいと思います。
私は、ディバッグにMsgbonを使用しており、my年月日、my月、などの項目についてしています。その都度、予想通りの値を得ており、正しいものと思っていますが、今一度、ご指示に従って確認したいと思います。

補足日時:2008/09/15 21:24
    • good
    • 0

> my収入 = ActiveCell.Value ⇒ データベースから値を取得


> fom出納簿訂正.cb金額.Value = my収入

my収入はどのような型宣言をなさってますか?
「データベースから値を取得」とありますが、データベースの値とはどのような型宣言をなさってますか?

この回答への補足

bin-chanさん
早速、回答を頂きありがとうございます。
また、QKWebの操作誤り、同じ質問を2度送ってしまいました。
気がついて質問を削除しようとしましたが、投降後24時間以内は、削除できないとのことで、明日にも訂正を行いたいと思います。
第1の質問については、先ほど、n-junさんから回答を頂き、解決しました。

追加の質問に回答を頂きありがとうございます。
関連のコーディングは、次のとおりです。このサブルーティンでデータベースの各内容を、UserFormsのプロパティにセットしています。なお、データベースでは日付を年月日で持っており、UserFormsでは、入力画面に合わせて、月と日を表示しています。

Sub sub出納簿訂正データ編集()
Dim my年 As Integer
Dim my月 As Integer
Dim my日 As Integer
Dim my年月日 As Date
Dim my科目 As String
Dim my細科目 As String
Dim my領収書 As String
Dim my内容 As String
Dim my備考 As String
Dim my収入 As Integer
Dim my支出 As Integer
Dim my金額 As Integer

Cells(my訂正行, 1).Activate 'my訂正行は、引継情報
my年月日 = ActiveCell.Value
my月 = Month(my年月日)
my日 = Day(my年月日)
ActiveCell.Offset(0, 1).Activate
my科目 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
my細科目 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
my領収書 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
my内容 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
my備考 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
my収入 = ActiveCell.Value
ActiveCell.Offset(0, 1).Activate
my支出 = ActiveCell.Value


fom出納簿訂正.cb月.Value = my月  ← ここでエラー
fom出納簿訂正.cb日.Value = my日
fom出納簿訂正.cb科目.Value = my科目
fom出納簿訂正.cb細科目.Value = my細科目

If my領収書 = "有" Then
fom出納簿訂正.cb領収書有.Value = True
End If

fom出納簿訂正.cb内容.Value = my内容   
fom出納簿訂正.cb備考.Value = my備考

If my科目 = "収入" Then
fom出納簿訂正.cb金額.Value = my収入
Else
fom出納簿訂正.cb金額.Value = my支出
End If

End Sub

補足日時:2008/09/15 12:52
    • good
    • 0
この回答へのお礼

bin-chanさん

データベース側の説明が漏れていました。
各シートの列ごとのセルの書式で、年月日は日付データ、収入、支出、合計は数値データ、その他の項目は標準データとしています。

(追記コメントをどのようにすればよいかが分からず、本コーナーを使用させていただきました。)

お礼日時:2008/09/15 13:45

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