- ベストアンサー
コマンドボタンのマクロ設定で書込禁止を実現
- コマンドボタンのマクロ設定で条件により上書き禁止を実現したいと思っています。
- テキストボックスにマンドボタンを配して、貼り付けマクロを設定していますが、誤って上書きしてしまった事がありました。
- マクロで解決できる方法があればと思っています。イベントプロシージャも勉強したいと考えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
普通に設定するならば、 Private Sub コマンド10_Click() Me!住所.SetFocus If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!名前.SetFocus End If Else If MsgBox("クリップボードのデータを貼り付けますか", vbYesNo) = vbYes Then DoCmd.RunCommand acCmdPaste End If End If End Sub ですみます。ところがクリップボードには何がデータとして 登録されているかわかりません。データを貼り付ける直前に 妙なものをコピー、例えば」画像、フォームのデザインビューでの 何らかのコントロールなどなど。このようなものを貼り付けると 何が起こるかわからないのでクリップボードのデータがテキスト型 のデータであるか確認する必要があります。 このような場合、APIというWindowsの機能を利用するための コードを利用するのですが、わけのわからないコードがずらずら 並ぶので違う方法をとります。 まず、フォームをデザインビューで開き、ツールボックスを 表示して、その中のコントロールの選択をクリックして表を 表示し、スクロールさせ、その中にMicrosoft Forms 2.0 と いう出だしから始まるいくつかのコントロールがあります。 その中の適当なコントロールをクリックして、たとえば、 Microsoft Forms 2.0 CheckBoxをクリックしてフォームの 適当なところに貼り付けます。 貼り付けたら一旦保存ボタンをクリックして保存します。 次に、フォームのコード表を表示し、ツールから参照設定を クリックします。するとたぶん Microsoft Forms 2.0 Object Library にチェックが入った状態で表示されていると思います。 これを確認したら、以下のコードをボタンクリックの イベントに設定してください。 Private Sub コマンド20_Click() Dim dObj As New DataObject Me!住所.SetFocus '住所に入力されている場合 'Yesを選択すればそのまま「住所」にフォーカスがとどまる If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!名前.SetFocus End If '住所が未入力の場合 Else dObj.GetFromClipboard 'クリップボードのデータがテキストの場合 'メッセージボックスの「No」を押した場合はそのまま住所にフォーカスをおいたままになる If dObj.GetFormat(1) Then If MsgBox("クリップボードにテキストデータがあります。新規にデータを貼り付けますか?", vbYesNo) = vbYes Then Me!住所 = dObj.GetText End If 'クリップボードのデータがテキストでない場合、あるいはデータがない場合 Else MsgBox ("クリップボードにテキストデータはありません") End If End If Set dObj = Nothing End Sub これが機能するようでしたら、フォームをデザインビューで開き、 貼り付けた Microsoft Forms 2.0 CheckBox を取り除いて ください。取り除いても Microsoft Forms 2.0 Object Library の参照ははずれることはありません。
その他の回答 (1)
- piroin654
- ベストアンサー率75% (692/917)
最初に、 条件「iznull」 は、 条件「IsNull」 つまり、「z」ではなく「s」です。 これでどうなるのか確認してみてください。 それから、 マクロ列1行目,アクション:エラー時 というアクションはどういう意図のもとで設定されたのですか。 どういうエラーを拾ったときにどういう処理をするのかという ことが抜けているように見えるのですが。 ということで、マクロはほとんど使ったことがないというか、 一部のマクロを除いて使うメリットがないので使いません。 なのでマクロについては以上にしておきます。 VBAコードでコントロールを移動し移動先のテキストボックスが 未入力ならばそのまま入力し、入力済みならばメッセージを 出して上書を許可するのかしないのかを設定します。 なお、「住所」というテキストボックスにはどのコントロール から移動するのか、あるいは「住所」というテキストボックス は一番最初のコントロールなのか、フォームは単票なのか表形式 なのかまったく書いてないのでこちらで勝手に設定します。 一応、「住所」というテキストボックスに移動するときの スタートするコントロールを「名前」とします。 Private Sub コマンド1_Click() Me!住所.SetFocus If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!名前.SetFocus End If End If End Sub これで初期の目的は達成できます。もうすこし手をいれて、 コマンドボタンを使わずに「住所」にマウスでクリック して入ったときに入力済みであるときの処理も含めて ボタンクリックとの連携処理をするならば、ボタンクリックの イベントと、「住所」のフォーカス取得時のイベントに以下のように 設定します。 Private Sub コマンド1_Click() On Error Resume Next Me!住所.SetFocus End Sub Private Sub 住所_Enter() If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!名前.SetFocus End If End If End Sub
補足
piroin654 レベル13様へ 早速のアドバイス有難うございました。結果を取り急ぎご報告いたします。 [スペルの訂正(IsNull)では] 機能いたしませんでした。「上書きになってしまいます。」 [アドバイスの構文では] VBA構文を「クリック時(プロシージャ―)」に貼り付けましたところ、テキストボックス「住所」にデータが存在する場合では正常に動作いたしました。”有難うございます”。尚、私の質問内容「実は言葉足らず」では、この段階で完了になります。が、実は、フォームは新規入力としての利用もありまして、テキストボックス「住所」にデータが無い時には、クリップボードのデータの「貼り付け」を可能にする方法は無いのでしょうか。”申し訳ございません” Private Sub コマンド1_Click() Me!住所.SetFocus If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!住所.SetFocus End If End If End Sub [お願い] テキストボックス「住所」にデータが無い場合での貼り付けを実現したいと思います。 以上、ご面倒をお掛けしますが、ご指導をお願い致します。
お礼
piroin654 レベル13様へ ご丁寧にアドバイスを頂きまして有難うございます。取り急ぎ「結果」をご報告させていただきます。下記「アドバイスご頂戴」のVBA構文を記述しましたところ、完全に動作いたしました「全てテキストデータです」。従いまして、ご配慮の構文についてはテストいたしませんでした。尚、マクロから変更した個数は約200個程度になりました。ありがとうございます。 [完全動作確認のアドバイスVBA構文] Private Sub コマンド10_Click() Me!住所.SetFocus If Not IsNull(Me!住所) Then If MsgBox("すでに入力されてます。上書しますか?", vbYesNo) = vbNo Then Me!住所.SetFocus End If Else If MsgBox("クリップボードのデータを貼り付けますか", vbYesNo) = vbYes Then DoCmd.RunCommand acCmdPaste End If End If End Sub 会社勤め時代はドキュメント「紙文書をファイル化」管理ソフト「本格的な文書管理ソフトは数百万円程度(当時)で買えない為」を使っていました。しかし、OCRの識字率が紙文書の状態「損耗・摩滅」や「活字・手書き」で大きく振られる為、全文検索は使えるレベルでは無かった印象「現在はわかりませんが」です。 対策として、ACCESS「多様な検索方法が可能」で見出だけ管理をする方法を取っていました「OCR後のテキストデータをコピペしてフォームに貼り付けたり、手打ちしたりの方法ですが」。恐らく「今でも」、多くの会社の全ての分野で、「探す」が仕事になっていると思われます「アクセスを使える方が本当に少ないですね」。私事で恐縮ですが、先日、ACCESSで文書管理DB「見出し管理専用で単純に入力(文書名・保存場所)と検索だけですが」を作りました「入力はこれからですが加齢対策の一環です(高齢化)」。 私の質問の仕方が悪く、piroin654 レベル13様にはご面倒をお掛けしましたが、追加のアドバイスを頂けて本当に感謝いたして居ります。ありがとうございました。