- ベストアンサー
既存のVBA記述に機能を追加したい
- 既存のVBA記述に機能を追加したいと思っています。テキストボックスが空の場合に限り、貼り付けコマンドが実行されますが、データがある場合も上書きするようにしたいと考えています。
- 私は、このサイトでアドバイスをいただいたVBAに機能追加を行いたいと思っています。特に、テキストボックスが空である場合に限り、貼り付けコマンドが実行されるようにしたいと考えています。
- 私は、VBAの既存コードに機能を追加したいと考えています。具体的には、テキストボックスが空の場合にのみ、貼り付けコマンドを実行するようにしたいと思っています。また、データがある場合でも、上書きすることができるようにしたいと考えています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
下記のように6行目と7行目が抜けています。 Private Sub コマンド10_Click() Me!テキスト10.SetFocus If Not IsNull(Me!テキスト10) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!コマンド10.SetFocus Else DoCmd.RunCommand acCmdPaste End If Else If MsgBox("クリップボードのデータを貼り付けますか", vbYesNo) = vbYes Then DoCmd.RunCommand acCmdPaste End If End If End Sub ------------------------------------------------------------------------------------- これはこれでよいとして、直接テキスト10へ書き込み、またはペーストでよいのでは! >当初、新規追加データのみを対象「上書き事故懸念」にしていましたが、 >既存データの変更要が散見されたこと。 >実際に運用してみて動作が確り「強固」していることが確認できたこと。 これらの懸念は上記で解消又は軽減されるとは考えられません テーブルデザインで、ルックアップ、インデックスで重複無し、値要求等の設定 フォームデザインで、 編集ロック、タブストップ(はい、いいえ) オートナンバーのフィールドは変更等は元々できませんのでフォーム上に配置する必要はありません。
その他の回答 (3)
- piroin654
- ベストアンサー率75% (692/917)
「実行時エラー ’429’」のほかに何かコメントが表示されると 思うのですが。たとえば、 「実行時エラー'429'ActiveXコンポーネントはオブジェクトを作成できません」 のようなものですか。 一応、こちらで見当をつけてのべてみます。 https://okwave.jp/qa/q9317356.html のところで、 次に、フォームのコード表を表示し、ツールから参照設定を クリックします。するとたぶん Microsoft Forms 2.0 Object Library にチェックが入った状態で表示されていると思います。 のところがあるとおもいますが、これを確認してみてください。 Microsoft Forms 2.0 Object Library が参照設定されていないとこのようなエラーか、あるいは 定義違反のエラーが表示されるとおもいます。 もし、参照設定されていないなら、もう一度 https://okwave.jp/qa/q9317356.html での設定の方法を確認してみてください。ただし この設定は一つのファイルにしか適用されません。 ファイルが違えばまた設定しないとエラーがでます。
- piroin654
- ベストアンサー率75% (692/917)
以下のようにしてみてください。ロジックはコメントを たどればわかると思います。なお、データがあっても 変更する場合はいきなりクリップボードのデータを 貼り付けるのではなく、確認をしてYesならば貼り付け、 Noならばテキストボックスにフォーカスがあたったまま 何もしません。 Private Sub コマンド10_Click() Me!住所.SetFocus 'データが入力されている場合 If Not IsNull(Me!テキスト10) Then '入力されているデータを変更しない場合 If MsgBox("すでに入力されてます。データを変更しますか?", vbYesNo) = vbNo Then Me!コマンド10.SetFocus '入力されているデータを変更する場合 Else 'クリップボードのデータを貼り付ける場合は貼り付け、 '貼り付けをしない場合はフォーカスはそのまま If MsgBox("クリップボードのデータを貼り付けますか", vbYesNo) = vbYes Then DoCmd.RunCommand acCmdPaste End If End If 'データが入力されていない場合 Else 'クリップボードのデータを貼り付ける場合 If MsgBox("クリップボードのデータを貼り付けますか", vbYesNo) = vbYes Then DoCmd.RunCommand acCmdPaste End If End If End Sub クリップボードのデータを鵜呑みにして貼り付けるのは あまりいい方法とはいえません。むしろ誤データの貼り付け につながる恐れさえあります。 https://okwave.jp/qa/q9317356.html でも述べた通り、クリップボードのデータの型の確認、それから 付け加えるならば、もしクリップボードのデータがテキストならば その内容の確認などをして貼り付けを行なうのがベストだと 思います。 そこで以前の回答のコードを少し変更してしたものを載せておきます。 これは、メッセージボックスでクリップボードの内容を確認するように なっています。このコードの構築で必要な手続きは以前のところで 述べています。普通だったらかならずこちらの方法をとると思いますが。 Private Sub コマンド5_Click() Dim dObj As New DataObject Me!住所.SetFocus '住所に入力されている場合 If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!名前.SetFocus Else dObj.GetFromClipboard 'クリップボードのデータがテキストの場合 'メッセージボックスの「No」を押した場合はそのまま住所にフォーカスをおいたままになる If dObj.GetFormat(1) Then If MsgBox("クリップボードにテキストデータがあります。データを貼り付けますか?" & vbNewLine & "********** テキスト内容 **********" & vbNewLine & dObj.GetText, vbYesNo) = vbYes Then Me!住所 = dObj.GetText End If End If End If '住所が未入力の場合 Else dObj.GetFromClipboard 'クリップボードのデータがテキストの場合 'メッセージボックスの「No」を押した場合はそのまま住所にフォーカスをおいたままになる If dObj.GetFormat(1) Then If MsgBox("クリップボードにテキストデータがあります。データを貼り付けますか?" & vbNewLine & "********** テキスト内容 **********" & vbNewLine & dObj.GetText, vbYesNo) = vbYes Then Me!住所 = dObj.GetText End If 'クリップボードのデータがテキストでない場合、あるいはデータがない場合 Else MsgBox ("クリップボードにテキストデータはありません") End If End If Set dObj = Nothing End Sub VBAコードを使用するというのは複雑なロジックの構築、 便利な機能を利用するということも上記のようにすれば できますが、それよりもロジックを正確に構築する、 あるいは構築したロジックが目指す目的に叶うように なっているかを確認できる、というのも使用するという メリットです。
お礼
piroin654 レベル13様へ ありがとございました。皆様「アドバイス側の方」へ必要な情報を十分にお伝えできていなかったことが改めて分かりました。前回、アドバイス頂きました、書き込み禁止のVBA「要望アドバイスでした」は全てのオブジェクトの該当するロケーションに記述致しました。尚、一部のデータベースで訂正要が多くでたこともあり、再アドバイスの形でお願い致しました。勿論、訂正の不必要なデータベースも多くありますので、そちらは「上書き禁止のVBA」のまま利用します「上書き事故を100%防ぐことは無理ですから」。お陰様でVBAが少しですが分かりそうな気がしてきました。ありがとうございました「感謝の副次効果になりました」。ありがとうございました。
補足
piroin654 レベル13様へ アドバイスを有難うございます。取り急ぎテストの結果をご報告いたします。私のスキル不足で上手く動かない様です。ご指導をお願い致します。下記の「※記述7行目の名前がよく分かっていないです」 [実施結果] ・データが無い時はいきなり「実行時エラー ’429’」が表示 ・データがある時は「すでに入力されています。上書しますか?」→(はい)→「実行時エラー ’429’」 [オブジェクト] コマンドボタン名=コマンド121 テキストボックス名:解決策 [記述内容] Private Sub コマンド121_Click() Dim dObj As New DataObject Me!解決策.SetFocus '住所に入力されている場合 If Not IsNull(Me!解決策) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!コマンド121.SetFocus ※ここの名前の設定名先がイマイチ分かっていないです。 Else dObj.GetFromClipboard 'クリップボードのデータがテキストの場合 'メッセージボックスの「No」を押した場合はそのまま住所にフォーカスをおいたままになる If dObj.GetFormat(1) Then If MsgBox("クリップボードにテキストデータがあります。データを貼り付けますか?" & vbNewLine & "********** テキスト内容 **********" & vbNewLine & dObj.GetText, vbYesNo) = vbYes Then Me!解決策 = dObj.GetText End If End If End If '住所が未入力の場合 Else dObj.GetFromClipboard 'クリップボードのデータがテキストの場合 'メッセージボックスの「No」を押した場合はそのまま住所にフォーカスをおいたままになる If dObj.GetFormat(1) Then If MsgBox("クリップボードにテキストデータがあります。データを貼り付けますか?" & vbNewLine & "********** テキスト内容 **********" & vbNewLine & dObj.GetText, vbYesNo) = vbYes Then Me!解決策 = dObj.GetText End If 'クリップボードのデータがテキストでない場合、あるいはデータがない場合 Else MsgBox ("クリップボードにテキストデータはありません") End If End If Set dObj = Nothing End Sub 以上、宜しくお願いします。
- tsubu-yuki
- ベストアンサー率46% (179/386)
> アドバイスをお願いします。 とのことですから、アドバイスを。 入力されているかどうか?の条件分岐に 「Yesなら貼り付け」を加えればOKです。 現状は「Noなら[コマンド10]にフォーカスを渡してスルー」なので、 そこにElse分岐してやるだけです。 正直、どうなんでしょう? と思ってしまいますね。
お礼
tsubu-yuki レベル10様へ ありがとうございました。アドバイスをいただきましたのに即追従できない状況「低スキル」でお手数をお掛けしました。少しでも反応できる様に最低限のコマンドと「利用ロケーション」は覚えたいと思います。ありがとうございました。
補足
tsubu-yuki レベル10様へ 私、VBAの知識が全くのところブアでございます。申し訳ございませんが、アドバイス頂いた「条件分岐に「Yesなら貼り付け」を加えればOKです。」の記述追加を教えて下さい。見よう見まねの「コピペ」記述で試しましたが完成には程遠い状態です。宜しくお願いします。
お礼
chayamati レベル12様へ ありがとうございました。シンプルな作り込みでアドバイスをいただきました「運用の結果は良好でした」。早速、訂正が必要なデータベースへ記述しました。書き込み禁止の記述とアドバイスの記述を使い分けて行きたいと思っています。「上書き事故を100%防ぐことは難しいからです(特に私に於いては・・・。)」 有難うございました。