電子書籍の厳選無料作品が豊富!

こんにちは。
先日もエラーを解決してもらい、前に進んでいましたが、またエラーで3日前から悩んでます。どこが原因なのか解りません。どなたかご教授頂きますようお願い致します。

Private Sub cboGoodsID_Change()
'商品IDコンボボックスのリストの2列目から4列目の値を代入
With cboGoodsID
If .ListIndex = -1 Then Exit Sub
txtGoodsName.Text = .List(.ListIndex, 1)
txtGoodsPrice.Text = .List(.ListIndex, 3)
txtGoodsUnit.Text = .List(.ListIndex, 2)

End With

'「明細行の追加」ボタンの設定
btnAdd.Enabled = CheckEntry()  ←ここが黄色く表示されます。

End Sub

Private Sub txtGoodsPraice_Change()
'明細行の追加」ボタンの設定
btnAdd.Enabled = CheckEntry()
End Sub

質問者からの補足コメント

  • ShowMeHowさんへ  有難うございます。内容は
    Private Function CheckEntry() As Boolean
    'Tagプロパティの設定されている全てのコントロールについて
    '値が設定されていればTrue、それ以外はFalse
    Dim ctrl As Control
    For Each ctrl In Me.Controls
    If ctrl.Tag <> "" Then
    If ctrl.Value = "" Then
    CheckEntry = False
    Exit Function
    End If
    End If
    Next
    CheckEntry = True
    End Function
    です。宜しくお願いします。

      補足日時:2016/09/09 21:31
  • WindFallerさんへ 有難うございます。
    実はご紹介頂いている横山先生の書籍に従ってプログラムしています。
    CheckEntryのコードはご紹介頂いているコードと全く同じを入力しています。
    初めて2ヶ月目で1ヶ月かけてやっと書籍のP283まで進んだところでバックしてしまいました。
    大変だと解っているのですがどうしても完成させたいと思っています。

      補足日時:2016/09/09 21:48
  • ShowMeHowさんへ
    遅くなってすみません。Valueがすべてのコントロールに存在するか?はわかりませんでした。行追加コードを入力したところ「SubまたはFunctionが定義されていません」の表示でした。エラーが移動して今度は同じコード内で次のところが黄色表示になってCheckEntryが青色表示になってしまいました。これは明細行を何行か追加した後、修正のためカーソルを修正行において「明細行修正」ボタンをクリックしたところ下記のコードのところがエラーとなっています。
    Private Sub txtQuantity_Change() ←黄色表示
    '「明細行の追加」ボタンの設定
    btnAdd.Enabled = CheckEntry() ←CheckEntryのみ青表示
    End Sub 
    大変お忙しい中、貴重なお時間を頂き、初心者の私にお付き合い頂き有難うございます。

      補足日時:2016/09/12 20:55

A 回答 (8件)

私としては、もう一度気を取り直して、立ち止まらずに、ガンバっていただくのが一番かとは思っています。

実は、そのための設定でもあったわけです。

この書き込みの最後に書きましたが、急に見えてくるものがあります。プログラミングで名を上げた人たちは、数ヶ月で、こうしたプログラムの謎解きをしてしまっています。私の知人などは、数ヶ月でプログラミング言語を覚えてしまいました。なのに、私などは、1年掛けても覚えられなかったのですが、ある日気が付きました。易より難へと進まないといけないということでした。一つ一つを完璧にするのではなく、大雑把に最後まで終わらせてしまい、分からないところをまた戻って細かくするという方法です。そうすると、分からなかったものが分かるようになることがあります。

この著者の横山達大さんという方の略歴を調べましたが、また、いろんな紆余曲折をしているようですが、私からみると、ずいぶんラッキーな人生のようだなって思います。なぜなら、VBAの多くの書籍が出版される中で、まだ絶版にもなっていないのに、もうプレミアが付く可能性が高くなっているからです。

このような大がかりの内容のものは少ないから、希少価値なのかもしれません。

今回のようなコードは、VBAをやってから、数回ほどはみたことがありますが、プロのワザだと思います。こうしたプロのワザは、めったに見られるものでもなく、掲示板では、簡単な内容を期待する人たちにとって、対局を示しているのかともいえます。

>基本的なことが理解出来てなく能力不足であることが明らかです。

私が書いた用語の意味が良くわからなかったかもしれません。もし、そうなら、申し訳ないことをしました。それは、私でも同じことです。掲示板では、いい気になっていると突き落とされるような感覚を味あわせてくれます。今、新しい言語を初めていますが、最初に何に手をつけてよいかわからなかったりします。

基本的なことと思えることでも、かなり難しいものがありますし、初歩的な話ではあっても、VBAだけでは理解できないものも多くあります。私の場合は、放送大学で、岡部洋一さんという方の「ソフトウェアのしくみ」という基礎から勉強しました。

本当は、一度、ネットの外で、ちゃんと知っている人に教わると、とても刺激になって、また違った気持ちにもなります。しかし、今回の内容を全部教えられる人はおそらくは滅多にいません。全体としては、VBAの範疇では収まらないからなのです。

今回のものは、同じ著者の『知識ゼロから学ぶ Excel VBA プログラミング ユーザーフォーム&コントロール』という本もあるようですが、その目次を見ると、これまた難しいわけです。

それとは別に、今のVBAの目指す方向は、こういうものとはまったく違うものになりつつあるようです。

今VBAの新しい技術を取り上げてくれているのは、以下のサイトではないかと思います。新しい基礎なのですが、この中の一つ、リボン操作でも、ずいぶん前に知ったのですが、そんなに勉強したわけではないのですが、できるようになったのは今年に入ってからです。Webコントロールも、今まで分からなかった部分が、急に組めるようになりました。どこかでテクニックを覚えたわけではありません。分からなかったものが分かるようになるのは、不思議ですね。頭の中で化学変化しているようです。

http://www.ka-net.org/
http://www.ka-net.org/office.html

最後に#6様の示したデバッグの技術は、大幅に自分の力をアップさせます。この私も、0n Error トラップは使いませんが、非常に特殊なデバッグのやり方をしています。そんなやり方あるのか、というような変な方法です。デバッグもひとつの技術です。

それでは、これからも、ひとつに限らずいろいろとお励みください。
    • good
    • 0
この回答へのお礼

WindFallerさんへ
大きな激励を頂き感謝申しあげます。お教え頂いたように一つ一つを完璧にするのではなく、大雑把に最後まで終わらせてしまい、分からないところをまた戻って細かくするという方法で最後まで頑張ってみます。それから解らないところに戻って勉強しながら解決したいと思いました。最後まで懇切丁寧にご教授頂き有難うございます。

お礼日時:2016/09/16 19:00

私も、もう一度フィードバックさせていただきます。



>Private Sub txtQuantity_Change() ←黄色表示
>'「明細行の追加」ボタンの設定
>btnAdd.Enabled = CheckEntry() ←CheckEntryのみ青表示
>End Sub 

黄色は分かるのですが、青表示って良く分からないです。

txtQuantity_Change
[txtQuantity]この綴りが間違いだとか?

青表示は、単なる識別子の意味だったような気がします。私は、識別子には色を入れていませんので、コメントしずらいです。

それから、#4で書いた間違いは、

「このtag のコントロールのValueが空白になってると、ボタンが使えるようにならない」ということでした。すみませんでした。

txtQuantity --tag -- 数量
txtslipDate --tag --日付
cboGoodsID--tag--商品ID

ところで、これはお分かりになっていますか?

今後の開発環境において、あまり直接関係のないアドバイスですが、VBEのツールのオプションで、私自身の設定ですが、

編集-自動構文チェックと変数宣言を強制する、をオフにします。
全般-エラートラップ**クラスモジュールで中断、
コンパイル*順次コンパイル**オフ (今までは、バックグラウンドコンパイルだけオフにしていました) とにかく、両方をオンにするのはやめたほうがよいようです。

ツールヒント表示やプロジェクトツリーとウィンドウ表示の同期はオン
ちょっとした違いが、かなり楽に入力しやすくなるかもしれません。

次に、込み入った時に、使うアドインです。
アドインは、VbePlus (Vector に残ってます) があるとコードの整形をしてくれるので便利です。
http://www.vector.co.jp/soft/win95/prog/se176543 …
Excel 2013 でも使用できます。

ただし、設定を変えるときは、管理者モードにしていないと変更できなくなってしまいました。Program Files にインストールされるからですが、イントール場所を工夫すれば、管理者モードにしなくてもよくなるかもしれません。その代わりになるのが、Smart Indenter ですが、英語版です。(この開発者は、良く知られた人物です)
http://www.oaltd.co.uk/Indenter/Default.htm

つまり、VBE のコードにインデント(字下げ)をつけてやることで、見やすくて、間違いを発見しやすくするのです。

以下の画像は、tagに名前を入れたところ。
「ExcelVBAで「インデックが有効範囲」の回答画像7
    • good
    • 0
この回答へのお礼

WindFallerさんへ
詳しくご教授頂き有難うございました。もう一度勉強し直します。基本的なことが理解出来てなく能力不足であること
が明らかです。もう少し時間がかかりそうです。今まで大変有難う御座いました。
このコーナーでまたお目に止まりましたら、ご教授頂きますようお願い致します。有難う御座いました。

お礼日時:2016/09/14 21:55

追加コードは、エラーが起きた際にfor-nextループの中のどのコントロールでエラーが起きたのかを調べるものです。


でも、その行まで行けていないようですので、これはとりあえず無視していただいて結構です。

function CheckEntryのスペルミスとかないですかね?

基本的なところで、まずデバッグ方法(特にステップ実行)を学ばれるとよいと思いますよ。
一行一行が実行できているのか、その時にどの変数がどう変化していくのかを観察できる方法です。
http://www.239-programing.com/excel-vba/basic/ba …
ここのa~eまで
(私がANo5でやったのは、これのdの方法です。)
    • good
    • 0
この回答へのお礼

ShowMeHowさんへ
ご教授有難うございます。もう一度スペルチェックをやってみます。デバック方法を勉強してみます。
もう一度、出直します。また壁にぶつかったときはご相談させて下さい。目につきましたらまたご教授頂きますよう
お願いします。
有難う御座いました。

お礼日時:2016/09/14 21:43

value って、すべてのコントロールに存在するのかな?



Private Function CheckEntry() As Boolean
Dim ctrl As Control
on error goto errh '*********行追加**********
For Each ctrl In Me.Controls
If ctrl.Tag <> "" Then
If ctrl.Value = "" Then
CheckEntry = False
Exit Function
End If
End If
Next
CheckEntry = True
exit function         '*********以下追加**********

errh:
debug.print err.number
debug.print err.description
debug.print ctrl.name   ’********追加ここまで**********
End Function

てすると、デバッグウィンドウに何か出力されますかね?
    • good
    • 0
この回答へのお礼

ShowMeHowさんへ 
ご指示のとおり行を追加様子をみました。「subまたはFanctionが定義されてません」出ました。
時間をかけて原因を探してみます。それでもダメなら飛ばして作業を進めてみます。残念ながら私の能力では追いついて行かないようです。勉強し直します。いままで本当に有難うございました。

お礼日時:2016/09/14 21:36

#2の回答者です。



ちょっと最初に話が脱線するかもしれませんが、大方の内容は分かりました。そして、ご質問の要因というのは、どうやら書籍の作り方そのものにあるようです。ふつうの教本は、ひとつのテーマを一つのコードで完了させるように出来ています。だから、多くの指導者は、何千という平易なコードをRunで試しなさい、といいます。ちなみに、語学も同様です。

ところが、最初に完成したコードがあって、それを埋めていく方式だから、今回のようにエラーが免れないようです。著者は分かってい、それを進めていくわけです。

この先、どう進めていくのか、なんとも言えませんが、いずれにしても、もし勉強をするなら、きちんと、設計や手順(コードは必要だったら書けばよいぐらいです)など、どこかに記録しておいたほうがよいです。おそらく、その本以外は、そんなことはひとつも出てこない可能性が高いです。

ノートでもいいのすが、書くのは大変ですから、PCのテキストのメモ帳にメモしておくとよいと思います。私は、テキストエディタです。最初、SJISから途中からUnicodeに直しました。

今回のものに対して、いくら著者の方が偉い人でも、
私からの経験からアドバイスがあります。
すでに発売されてから、4年以上も経つ内容ですので、著者の方にメールをするかは迷うところですが、私の経験則で、

 起動の際に、
 'Application.Visible = False

と、

UserFom 上のUserForm_QueryCloseで、

 ActiveWorkbook.Save
 Application.Quit

これは、私の中では、禁止技だとしていますし、私に相談された方には、誰にも同じことを言っています。以前、不明のエラーに苛まれることがクレームで突き止めました。Excel2003 までと、それ以降とは違うのかもしれませんが、私は、疑心暗鬼です。著者の方は、十分に検証されたと思いますが、読者側としても、検証の価値はあると思います。

今回のCheckEntry() は、
txtQuantity --tag -- 数量
txtslipDate --tag --日付
cboGoodsID--tag--商品ID
このtag のコントロールのValueが空白になっていないと、更新できないようになっているわけですね
    • good
    • 0
この回答へのお礼

WindFallerさんへ
貴重なお時間を頂き有難うございます。
基本があまり解っていない中で、システムを早く完成させため著者の本の手順に従ってコードを書いてきました。もう少し本を読み解明したいと思っています。「このtag のコントロールのValueが空白になっていないと、更新できない」については今すぐに返答でず申し訳ありません。

お礼日時:2016/09/12 21:08

> btnAdd.Enabled = CheckEntry()  ←ここが黄色く表示されます。



上の状態でエラーメッセージを閉じて、F8キーを押して一行ずつ実行させていけば
実際に問題のある行まで辿り着きませんか?
    • good
    • 0

こんにちは。


たぶん、私は、ご質問者さんには、初めてレスをつけるかと思いますが、今、VBAの勉強をなさっているのですか?

半日掛かりで、やっと、ご質問の全容が見えました。今、書籍をお使いになっているのでしょうか。内容のレベルとしては、VB6では、応用編ぐらいにはなりますが、VBAでは、テクニックとは別の技術として、最高位につけてもよいと思います。

書名:『アプリ作成で学ぶExcel VBAプログラミングユーザーフォーム&コントロール』秀和システム 横山達大著
http://www.shuwasystem.co.jp/products/7980html/3 …

http://amazon.jp/dp/4798032956
(5点の書評には疑問がつきます)

私は、この書籍を持っておりませんが、内容は、VB6 のダウンサイジングの内容のようです。今では、使わない手法も見られます。コードの内容には驚きました。なんと、このコードの中には、C++などのオブジェクト指向で使われるコンストラクタの考え方まで導入しているのですから恐れ入る、というしかありません。

それで、今、このコードは、システム として働くものですから、個別のコードであれこれやっても全体が見えてきません。

決して安い本ではありませんし、相当の実力がないと、全部やり通しても何をやっているのか分からないのではないかと思います。

私は、ご質問者さんの実力は分かりませんが、ご質問の内容では、このレベルのものは、決して楽ではないのではないかと思います。次から次へ、問題が発生してしまいます。

ご質問のCheckEntryのコードは、

'同じ、UserFormのモジュール内に入れて上げればよいのですが、
'意図が分からないと、意味がありません。(私見)

Private Function CheckEntry() As Boolean
  'Tagプロパティの設定されている全てのコントロールについて
  '値が設定されていればTrue、それ以外はFalse
  Dim ctrl As Control
  For Each ctrl In Me.Controls
    If ctrl.Tag <> "" Then
      If ctrl.Value = "" Then
        CheckEntry = False
        Exit Function
      End If
    End If
  Next
  CheckEntry = True
End Function

それぞれのコントロールにtag をつけなさいという意味が、なんのためにするのとか、私は、こうした手法を使ったことがありません。
    • good
    • 0

CheckEntryの引数がないとか?



function CheckEntry (かな?)の内容を追記いただけますか?
    • good
    • 0

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