こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

既存のVBAに機能を追加させたい

先日、このサイトでアドバイスをいただきましたが「ありがとうございます」、更に能力をアップできればと思っています。アドバイスをお願いします。

[やりたいこと]
既存のVBA記述に機能を追加したい。「このサイトでアドバイスをいただいたVBAに機能追加」

現在、テキストボックスが空「データなし時」の場合に限り、貼り付けコマンドが実行されますが、「データありの場合」は、表示されたダイアログの「はい」を押しても上書きされません。今回(機能を追加)、データありの場合も「貼り付け(上書き)」を実行させたいと思っています。

・フォーム:フォーム10
・コマンドボタン:コマンド10
・テキストボックス:テキスト10

Private Sub コマンド10_Click()
  Me!テキスト10.SetFocus
  If Not IsNull(Me!テキスト10) Then
    If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then
      Me!コマンド10.SetFocus
    End If
  Else
    If MsgBox("クリップボードのデータを貼り付けますか", vbYesNo) = vbYes Then
      DoCmd.RunCommand acCmdPaste
    End If
  End If
End Sub

[再アドバイスのお願いの背景]
当初、新規追加データのみを対象「上書き事故懸念」にしていましたが、既存データの変更要が散見されたこと。それと、実際に運用してみて動作が確り「強固」していることが確認できたこと。以上の二点です。宜しくお願いします。

投稿日時 - 2017-04-25 17:15:51

QNo.9321668

困ってます

質問者が選んだベストアンサー

下記のように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へ書き込み、またはペーストでよいのでは!
>当初、新規追加データのみを対象「上書き事故懸念」にしていましたが、
>既存データの変更要が散見されたこと。
>実際に運用してみて動作が確り「強固」していることが確認できたこと。
これらの懸念は上記で解消又は軽減されるとは考えられません
テーブルデザインで、ルックアップ、インデックスで重複無し、値要求等の設定
フォームデザインで、 編集ロック、タブストップ(はい、いいえ)
オートナンバーのフィールドは変更等は元々できませんのでフォーム上に配置する必要はありません。

投稿日時 - 2017-04-26 22:50:07

お礼

chayamati レベル12様へ

ありがとうございました。シンプルな作り込みでアドバイスをいただきました「運用の結果は良好でした」。早速、訂正が必要なデータベースへ記述しました。書き込み禁止の記述とアドバイスの記述を使い分けて行きたいと思っています。「上書き事故を100%防ぐことは難しいからです(特に私に於いては・・・。)」

有難うございました。

投稿日時 - 2017-04-29 05:50:27

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

「実行時エラー ’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
での設定の方法を確認してみてください。ただし
この設定は一つのファイルにしか適用されません。
ファイルが違えばまた設定しないとエラーがでます。

投稿日時 - 2017-04-28 23:09:34

ANo.3

以下のようにしてみてください。ロジックはコメントを
たどればわかると思います。なお、データがあっても
変更する場合はいきなりクリップボードのデータを
貼り付けるのではなく、確認をして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コードを使用するというのは複雑なロジックの構築、
便利な機能を利用するということも上記のようにすれば
できますが、それよりもロジックを正確に構築する、
あるいは構築したロジックが目指す目的に叶うように
なっているかを確認できる、というのも使用するという
メリットです。

投稿日時 - 2017-04-27 02:09:54

補足

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

以上、宜しくお願いします。

投稿日時 - 2017-04-28 12:47:30

お礼

piroin654 レベル13様へ

ありがとございました。皆様「アドバイス側の方」へ必要な情報を十分にお伝えできていなかったことが改めて分かりました。前回、アドバイス頂きました、書き込み禁止のVBA「要望アドバイスでした」は全てのオブジェクトの該当するロケーションに記述致しました。尚、一部のデータベースで訂正要が多くでたこともあり、再アドバイスの形でお願い致しました。勿論、訂正の不必要なデータベースも多くありますので、そちらは「上書き禁止のVBA」のまま利用します「上書き事故を100%防ぐことは無理ですから」。お陰様でVBAが少しですが分かりそうな気がしてきました。ありがとうございました「感謝の副次効果になりました」。ありがとうございました。

投稿日時 - 2017-04-29 05:45:30

ANo.1

> アドバイスをお願いします。
とのことですから、アドバイスを。

入力されているかどうか?の条件分岐に
「Yesなら貼り付け」を加えればOKです。
現状は「Noなら[コマンド10]にフォーカスを渡してスルー」なので、
そこにElse分岐してやるだけです。


正直、どうなんでしょう?
と思ってしまいますね。

投稿日時 - 2017-04-25 19:39:22

補足

tsubu-yuki レベル10様へ

私、VBAの知識が全くのところブアでございます。申し訳ございませんが、アドバイス頂いた「条件分岐に「Yesなら貼り付け」を加えればOKです。」の記述追加を教えて下さい。見よう見まねの「コピペ」記述で試しましたが完成には程遠い状態です。宜しくお願いします。

投稿日時 - 2017-04-26 05:52:12

お礼

tsubu-yuki レベル10様へ

ありがとうございました。アドバイスをいただきましたのに即追従できない状況「低スキル」でお手数をお掛けしました。少しでも反応できる様に最低限のコマンドと「利用ロケーション」は覚えたいと思います。ありがとうございました。

投稿日時 - 2017-04-29 05:30:24