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

解決済みの質問

コマンドボタンのマクロ設定で書込禁止を実現

コマンドボタンのマクロ設定で条件により上書き禁止を実現したいと思っています。

[やりたい内容]
入力用に作成したフォームの「テキストボックス」にマンドボタンを配して、貼り付けマクロを設定していますが、誤って上書きしてしまった事がありました。そこで、「コマンドボタン」にマクロの設定で "上書き禁止" に出来ますでしょうか。

[やってみたこと]
一例としてテキストボックスに住所を入力する際のマクロを下記の要領で設定してみました。しかし、「実施1」も「実施2」も上書きされてしまいます。

テキストボックス名:「住所」
テキストボックス「住所」の横にコマンドボタンを配し「クリック時」のマクロ設定

■実施1
マクロ列1行目,アクション:エラー時
マクロ列2行目,コントロールの移動(引数)「住所」
マクロ列3行目,アクション:コマンドの実行(引数)「貼り付け」、条件「iznull」
マクロ列4行目,アクション:メッセージボックス(引数)「上書き禁止」

■実施2
マクロ列1行目,アクション:エラー時
マクロ列2行目,コントロールの移動(引数)「住所」
マクロ列3行目,アクション:コマンドの実行(引数)「貼り付け」
マクロ列4行目,アクション:メッセージボックス(引数)「上書き禁止」、条件「iznull」

[マスト希望]
使用しているデータベースが全てマクロの設定になっている関係もあり、第一希望としてはマクロで解決できる方法があればと思っています。

[ウォント希望]
新たに作成するデータベースを対象にイベントプロシージャも勉強したいと考えています。できればで結構ですが、イベントプロシージャ―での解決記述もアドバイスいただければ有り難いと思います。※欲張りで申し訳ございません。

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

投稿日時 - 2017-04-14 06:59:06

QNo.9317356

困ってます

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

普通に設定するならば、

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
の参照ははずれることはありません。

投稿日時 - 2017-04-15 07:46:58

お礼

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様にはご面倒をお掛けしましたが、追加のアドバイスを頂けて本当に感謝いたして居ります。ありがとうございました。

投稿日時 - 2017-04-15 20:31:59

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

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

回答(2)

ANo.1

最初に、

 条件「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

投稿日時 - 2017-04-14 12:22:03

補足

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

[お願い]
テキストボックス「住所」にデータが無い場合での貼り付けを実現したいと思います。

以上、ご面倒をお掛けしますが、ご指導をお願い致します。

投稿日時 - 2017-04-14 13:59:28