Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,721 から 4,760 までを表示しています。
4
hatena 2020/09/15 (火) 15:14:57 修正 >> 2

いちおう、たたき台として、

Private Sub btnSubmit_Click()

    Dim strFilter As String
 
    '中略
  
    '条件指定3_複数キーワード入力
    '読点[、]区切りで部分一致でor条件 句点[。]区切りで部分一致でand条件)
    If Me.txtWord3 <> "" Then
       Dim strSubFilter As String
       strSubFilter = Me.txtWord3
       strSubFilter = "*" & Replace(strSubFilter, "。", "* And *") & "*"        
       strSubFilter = Replace(strSubFilter, "、", "* Or *")
       strSubFilter = "(" & BuildCriteria("職名", dbText, strSubFilter) & ")"

       strFilter = strFilter & " AND " & strSubFilter
    End If

    '後略

End Sub

読点(、)、句点(。)混在は可能ですが、And演算子がOr演算子より演算順位が高いので、
ユーザーがそれを理解していないと期待の結果にならない場合があるので注意が必要。

上記の strSubFilter には、下記のような条件式が格納されます。

Me.txtWord3 => strSubFilter

チーフ。リーダー => (職名 Like "*チーフ*" And 職名 Like "*リーダー*")

チーフ、リーダー => (職名 Like "*チーフ*" Or 職名 Like "*リーダー*")

チーフ。リーダー、ボス => (職名 Like "*チーフ*" And 職名 Like "*リーダー*" Or 職名 Like "*ボス*")

3

部分一致が考慮されていないですね。
あと、AND と OR の演算優先順位を考慮する必要もあります。

2

可能ですが、下記の点について補足をお願いします。

'条件指定3_複数キーワード入力_読点[、]区切りであいまいor検索 読点[。]区切りで 完全一致(and検索)

の部分ですが、
読点[、]区切りであいまいor検索は、
あいまい(=部分一致) で or条件、つまり、複数のキーワードのうち一つでも含まれれば抽出する、
ということでよね。

読点[。]区切りで 完全一致(and検索) は(読点は句点の間違いとして)、
完全一致でand条件ということはありえないので、部分一致 で and条件ということですよね。
つまり、複数のキーワードをすべて含むデータを抽出する。

あと、読点 と 句点 が混在する可能性はありますか。
「チーフ。リーダー、ボス」とか。

1
hiroton 2020/09/15 (火) 14:36:13 49c70@f966d

1つのテキストボックスで、
「、」区切りで(or検索)、「。」区切りで(and検索)
のように、2つの条件を切り替えるような事は
可能でしょうか?

テキストの中に「、」「。」が含まれているかどうかチェックすれば条件分岐はできます

Dim matchOr as boolean
Dim matchAnd as boolean

matchOr = InStr("、", Me!txtWord) > 0
matchAnd = InStr("。", Me!txtWord) > 0

If matchOr And matchAnd Then
'「、」「。」両方含むとき'
ElseIf matchOr And Not matchAnd Then
'「、」だけ両方含むとき'
ElseIf Not matchOr AND matchAnd Then
'「。」だけ両方含むとき'
Else
'「、」「。」どちらも含まないとき'
End If

条件指定3で実現するには
どのようなコードがありますでしょうか?

BuildCriteriaを2回重ねることはできないので、どちらかの条件部分を自前で実装ですね。ただ、配列にして処理してしまえば出来上がった条件をつなげるだけなのであっさりできます

Const OrSeparator = "、"
Const AndSeparator = "。"

Dim filterWords
Dim n As Long

If Me!txtWord3 <> "" Then
    filterWords = Split(Me!txtWord3, OrSeparator)
    For n = 0 To UBound(filterWords)
        filterWords(n) = BuildCriteria("[職名]", dbText, _
        "" & Replace(StrConv(filterWords(n), vbWide), AndSeparator, " AND 
") & "")
    Next

    strFilter = strFilter & " AND " & Join(filterWords, " OR ")
End If
7
hatena 2020/09/15 (火) 13:17:47 修正

引用符に関しては、下記が参考になると思います。

Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips

上記のリンク先でもいってますが、まずは、VBAコードとSQLコードは違う言うことを意識する必要があります。
まずは上記の解説を読んで理解してください。

そのうえで、

=DLookUp("案件NO","Q_案件","購入日=#" & [最新購入日] & "#")

この DLookup はVBAの関数です。それぞれの引数は、
第一引数 フィールド名またはフィールド名を含む式を文字列で指定
第二引数 テーブル名/クエリ名を文字列で指定
第三引数 抽出条件式を文字列として指定
抽出条件式はSQLのコードです。クエリのSQLのWHERE句に記述する式のことです。
それをVBAの文字列とします。

あと、コード中で、数値、文字列、日付を扱うときは、扱いが異なります。
数値はそのまま、文字列は引用符で囲む(上記のリンクを参照)、日付は # で囲む、
という決まりです。
これはVBAでもSQLでも同じです。

6
どんぐり 2020/09/15 (火) 12:33:05 0029a@1c915

うまくいきました!すごいです。

や&やコーテーションの使い方がいつまでたっても難しく感じます。

何か参考になる良いサイトはないでしょうか…
(今回下記サイトを参考にしていたのですが、#の件がのっていませんでした)
https://pctips.jp/pc-soft/access-dlookup-howto2019/

5
hiroton 2020/09/15 (火) 09:19:38 49c70@f966d

内容細かく見てないけど
=DLookUp("案件NO",[Q_案件],"購入日='" & [最新購入日] & "'")

=DLookUp("案件NO","Q_案件","購入日=#" & [最新購入日] & "#")
かな?

適当なテキストボックスのコントロールソースにに「=[最新購入日]」としてみましょう。次に「=[Q_案件]」としてみましょう

4
どんぐり 2020/09/15 (火) 08:53:53 0029a@1c915

詳しく教えていただき、ありがとうございます。
この件につきまして、最新購入日の他のフィールドをひっぱりたいのですがうまくいきません。
サブフォーム内にテキストボックスを作成し、コントロールソースに以下の式を入れましたが
「Name?」と表示される状況です。
コーテーションや「txt・・・」に変更したりと、苦戦しているのですがうまくいきません…

=DLookUp("案件NO",[Q_案件],"購入日='" & [最新購入日] & "'")

どこに問題があるのでしょうか??スミマセン…

1
hiroton 2020/09/14 (月) 14:55:29 c0292@f966d

フォームにはデータの操作について追加の許可削除の許可更新の許可のプロパティがあります

主フォームのレコード移動時と、グループタイトルの更新後処理でサブフォームのこれらのプロパティを変更すればロックは掛けられると思います
「グレーに」するも同じタイミングでサブフォームの背景色を変更してあげればそれっぽくなりそうですがどんな感じが希望なのかですね

更新のみが問題で対象がテキストボックスやコンボボックスだけなら条件付き書式を使ってフィールドの有効・無効を切り替えるでもいいと思います
Yes/No型フィールド(チェックボックス)なんかは条件付き書式が使えないのでこの方法は使えませんが

5
どんぐり 2020/09/13 (日) 09:56:00 1d451@2d897

ありがとうございます!
すごく複雑なことかと思っていたのですが、こんなに短いコードで解決したのですね…
勉強不足でスミマセン。本当に助かりました。

4

送付されたファイル 検索したい.accdb

ファイル見ました。
「F案件グループ」フォームの検索ボタン「コマンド14」のイベントプロシージャを下記のように記述してください。

Private Sub コマンド14_Click()
    Dim FindWhat

    FindWhat = DLookup("案件グループID", "クエリ1", "案件No='" & Me.テキスト12 & "'")
    If IsNull(FindWhat) Then
        MsgBox "該当する案件Noは見つかりませんでした。"
    Else
        Me.案件グループ.SetFocus
        DoCmd.FindRecord FindWhat
    End If
End Sub

これでご希望の結果になると思います。

検索テキストボックス「テキスト12」はコンボボックスに変更するとより使いやすくなると思います。
「テキスト12」を右クリックして[コントロールの種類の変更]-[コンボボックス]をクリック。
「値集合ソース」に下記のSQLを設定します。

SELECT DISTINCT T案件.案件NO FROM T案件 WHERE T案件.案件NO Is Not Null; 

上記の改修をしたファイル 検索したい_hatena.accdb

3
どんぐり 2020/09/12 (土) 22:09:21 1d451@2d897 >> 2

②について説明不足でしたので書きなおします。
②サブフォーム内の案件NOに「5555」が含まれる、案件グループ「0002」のページを開く

こういった感じのことができるようにしたいです…

2
どんぐり 2020/09/12 (土) 22:05:51 1d451@2d897

お返事ありがとうございます!先ほど「Microsoft Access 掲示板用ファイル送信」からサンプルデータを送信させていただきました。
具体的にやりたいことは、
①「F案件グループ」のヘッダーの検索ボックスで「5555」と検索
②サブフォーム内に「5555」が含まれる、案件グループ「0002」のページを開く
※案件NOが空のものも存在します。
※本当は存在しないで欲しいのですが、案件NOが複数のグループに存在する可能性もあります。
※案件NOをインデックス(重複無)にしないのは、空のものを作りたいことがあるためです。

以上になります。お時間ある際にご確認いただけたらうれしいです。

1

念の為に確認ですが、「案件グループフォーム」上にサブフォームコントロールがありそこに「サブ案件フォーム」が埋め込まれているということでしょうか。(たまに、主フォームと別に引いていフォームのことをサブフォームと表現される方がみえるので)

サブフォームコントロールだとするなら、リンク親フィールドとリンク子フィールドの設定を「案件番号」に設定すれば、自動でメインフォームの案件番号でサブフォームのデータは絞り込まれます。

これで解決でないのなら、メインフォーム、サブフォームのテーブルのフィールド構成、クエリならSQL文とうを提示して、どのようにしたいのか具体的に説明してください。

4
hideki 2020/09/11 (金) 10:29:47 09c37@96514

hatena様
返信おくれて申し訳ありません。
解説までしていただき、本当にありがとうございました。

3
セロハン 2020/09/10 (木) 17:35:23 f1ed8@27a28

そうだったんですね!ホッとしました。
できるだけ自分で調べたいと思いながらなかなか答えに辿り着けずで…
お忙しい中、いつもご回答ありがとうございます。

2

Accessは、データを削除してもファイルサイズは小さくなりません。実際にデータを削除するのではなく削除したというマークを付けるだけです。大量のデータを扱うのが前提のデータベースは一般的にこのような設計になってます。
つまり、データの追加、削除を繰り返すと、削除マークのついた無駄なスペースがどんどん増えていくわけです。

この無駄なスペースを削除する機能が「最適化/修復」です。定期的に「最適化/修復」を実行するようにするとファイルサイズが無駄に肥大することなく運用できます。

「名前を付けて保存」をするとこの無駄なスペースを除いてコピーが作成されるのだと思われます。

ということで特に気にすることはないと思います。

1
セロハン 2020/09/10 (木) 16:19:21 0029a@1c915

朝から「管理2」で作成していたデータにつき、
名前を付けて保存⇒「Accessデータベース」で新たに「管理3」として保存したところ
ますます容量が小さくなりました。
「管理」 25000KB
「管理2」13000KB ←朝より大きくなっている
「管理3」4000KB

気になってバックアップのサイズを確認したところ
4000KB程度のものと、15000KBのもの(バックアップ後に触った?)が存在しました。
サイズが異なり、不安になっております。
データ整理する際、消してはまずいものがありますでしょうか。
また、データ保存方法は
名前を付けて保存⇒「Accessデータベース」ではないのでしょうか。
※検索して見ていたのですが、特に保存に問題があるようには思えず…

7
どんぐり 2020/09/09 (水) 20:06:24 1d451@2d897 >> 5

インデックス(重複)にしたのち、色々設定を確認していたところ
設定に問題があったようで、案件IDなしで追加できるようになりました。
お騒がせして申し訳ありません。これで作っていきたいと思います。ありがとうございました。

6
どんぐり 2020/09/09 (水) 17:03:42 1d451@2d897 >> 5

>案件IDはなにか別のシステムから案件が正式に決まったときに発行されるとかなんですかね
仰る通りです。書き忘れており申し訳ありません・・

主キーからは外したのですが、インデックス(重複無)に設定していたり、リレーションシップの関係で、空白にしたり、仮で「0000」と入れておけないようです。
(設計に問題があるのか…?)
もう1つ別にテーブルを作った方がいいのかな、など考えております。(案件IDがないもの専用。案件が発行された時点で更新クエリを使って移動?)
他に良い方法があれば何卒ご教示ください😭

5
hiroton 2020/09/09 (水) 16:04:04 25184@f966d >> 3

案件管理IDを別に用意して案件IDはインデックス(重複あり)で運用する

案件IDはなにか別のシステムから案件が正式に決まったときに発行されるとかなんですかね(ACCESSでは正式に決定される前に情報入力したいみたいな)
データとして存在するのに主キーとして設定できるフィールドがないのなら自前で用意するしかないですね

4
hiroton 2020/09/09 (水) 15:41:07 25184@f966d >> 2

新規登録(登録前)ならフィールドの規定値を書き換えてあげればいいです

Docmd.OpenForm "新規登録ページ"
Forms!新規登録ページ!案件グループID.DefaultValue = Me!案件グループID
1

まずは、下記のリンク先の関数FormRecNoをコピーして標準モジュールに貼り付ける。

B.WH |AC : 帳票フォームで表示順に連番を付ける

消したいフィールドを覆っているテキストボックス(リンク先だと txtHideB)のプロパティを下記のように変更する。

コントロールソース
=IIf(([FieldA] Like "[!A-Z]" Or [FieldA] Is Null) And [FormRecNo] Mod 2=0,"gggg","")

前景色 グレー

次にこのテキストボックスをコピーして、詳細セクションに貼り付けてから、移動させて txtHideB の上に重ねます。
プロパティを下記のように設定します。

コントロールソース
=IIf(([FieldA] Like "[!A-Z]" Or [FieldA] Is Null) And [FormRecNo] Mod 2=1,"gggg","")
前景色 白
名前 txtHideB2

このテキストボックスのフォーカス取得時のイベントプロシージャを下記のように記述します。

Private Sub txtHideB2_Enter()
    If Me.txtHideB = "" Then
        Me.FieldB.SetFocus
    Else
        Screen.PreviousControl.SetFocus
    End If
End Sub

以上でどうでしょうか。
実際に試してはいません。
FormRecNo関数は重い処理でので、実用的かどうか不明です。

3
どんぐり 2020/09/09 (水) 14:48:08 1d451@2d897

悩んでいると書いた件につきまして、
ここ1か月くらい仕様設計を悩んでいますがいい案が思い浮かばないので書かせていただきます。
同じ案件グループに入る案件データにつきまして、期限の終わりに近づいたときに
次の案件データをアクセスで準備したいのですが、すぐには案件IDが発行されない状態です。
そこで、案件フォームの帳票にタブ切り替えで「今回の情報」と「次回の情報」を表示させているのですが
今回の「次回」と次回の「今回」が冗長になってしまうため
なんとか1つで済ませられないかと考えているのですが、
案件IDがすぐに発行されないのが厄介な状態になっています。
(案件IDは主キーから外しましたが、インデックスで重複無に設定しているので、空の状態で
 データ登録ができない。)

もし、この文では意味不明だが教えていただける、という方がいらっしゃったら
モデルデータのようなものを作成してみたいと思います。

2
どんぐり 2020/09/09 (水) 14:31:07 1d451@2d897

ありがとうございます!!とても助かりました。
じっくり確認させていただきます。

この件周辺の仕様が私には難しく、どうしたものかずっと悩みあぐねております…
絡みでもう1件質問よろしいでしょうか…すみません…

サブ案件フォームに新規登録ボタンを作り、そこから案件を登録させようとしているのですが
そのとき、自動で開いた元ページの案件グループIDが入って欲しいです。
新規登録ページへの、値の受け渡しはどうすればよいでしょうか

1
hiroton 2020/09/09 (水) 11:36:26 25184@f966d

DLooukup関数で案件グループIDと一つ前の日を指定すれば案件IDは拾えますね。「一つ前」は自身より小さいものの中で最大のものということでDMax関数で拾えます

ついでに「案件グループID」と「案件発生日」の両方のデータがないと取得できないので共通して使えるように関数化して、それぞれの更新後処理に「=set前回の案件ID()」で呼び出すとかですかね

Private Function set前回の案件ID()
Dim lastDay

If IsNull(Me!案件グループID) Or IsNull(Me!案件発生日) Then Exit Function

lastDay = DMax("案件発生日", "T案件テーブル", "案件グループID=" & Me!案件グループID & " AND 案件発生日<#" & Me!案件発生日 & "#")

If IsNull(lastDay) Then Exit Function

Me!前回の案件ID = DLookup("案件ID", "T案件テーブル", "案件グループID=" & Me!案件グループID & " AND 案件発生日=#" & lastDay & "#")
End Function
2
どんぐり 2020/09/09 (水) 09:56:53 1d451@2d897

コンボボックスをrequeryすればよいのですね…
これで、沢山のことが解決しそうです。ありがとうございます!

2
ポンタ 2020/09/09 (水) 09:52:33 1d451@2d897

2GBはまだ遠そうだったので、残すことにしました。
アドバイスいただき、大変参考になりました。助かりました。
ありがとうございました。

1

①どんどん増殖してデータが重くなるのが嫌

テーブルの正規化、インデックスの設定が適切にされていれば、データ数が増えてもそれほど重くならないので気にしなくてもよいと思ってます。

②過去のデータを登録する際TODOリストはいらない(TODOを埋める手間は省きたいしうっとうしく感じる)

ちょっと意味が分かりません。不要なら、埋める必要はないのでは。
埋める必要があるとしたら、テーブル設計が間違っている可能性が大だと思います。

古いデータを削除するとしたら、Accessファイルの最大サイズ2GBに近づいてきた時ぐらいだと思ってます。
また、すぐに2GBを超えそうになるなら、Accessで扱うには大きすぎるデータだと思いますので、本格的なRDBMS(SQLサーバーとかオラクルとか・・・)への移行を検討すべきでしょう。

2
トマト 2020/09/08 (火) 12:04:48 0029a@1c915 >> 1

就業後にじっくり確認させていただきます。色々読んできたつもりなのですが、なかなか理解しきれず…
教えていただき、本当にうれしいです。読むのが楽しみです。

1

コンボボックスを Requery すればいいでしょう。
コードをどこに書くかによってコードは異なりますが、下記のようにすればどこに書いても機能します。

Forms!メインフォーム名!サブフォームコントロール名.Form!コンボボックス名.Requery
1
hiroton 2020/09/08 (火) 10:28:50 c3560@f966d

基本的なところなので解説しているサイトをいろいろ探してみると良いです
オブジェクトを入れる変数(Office TANAKAさん)

VBAでは既定のプロパティの省略というコーディングを楽にするための仕組みがあるので、その結果として違いの判らない動作もあります。以下サンプルコードを記述するので違いを比べてみてください

ex)通常の変数宣言(文字列型)

Dim txtTitle as string '//文字列型として変数を定義
txtTitle = Me.txtタイトル
'//単純な変数の代入の場合、「式」は評価され、既定のプロパティが代入される。次の式と等価
txtTitle = Me.txtタイトル.Value

MsgBox txtTitle '//"ドラゴンクエスト"が表示される。次の式と等価
MsgBox "ドラゴンクエスト"

MsgBox Me.Controls(txtTitle) '//"ドラゴンクエスト"という名前のコントロールが参照される(多分存在しないのでエラー)。次の式と等価
MsgBox Me.Controls("ドラゴンクエスト").Value 

txtTitle = Me.txtタイトル.Name '//Nameプロパティを明示したので"txtタイトル"が代入される
MsgBox Me.Controls(txtTitle) '//"ドラゴンクエスト"が表示される。次の式と等価
MsgBox Me.Controls("txtタイトル").Value 

txtTitle = "ファイナルファンタジー"
MsgBox Me.txtタイトル '//"ドラゴンクエスト"が表示される

txtTitle.SizeToFit '//ただの文字列にメソッドはないのでエラー

ex)オブジェクトとしての変数宣言(Textbox型)

Dim txtTitle as TextBox '//テキストボックス型として変数を定義
Set txtTitle = Me.txtタイトル '//objectへの代入、Setが必要

MsgBox txtTitle '//"ドラゴンクエスト"が表示される
'//txtTitleはテキストボックスなので既定のプロパティ(Value)が参照される。次の式と等価
MsgBox Me.txtタイトル.Value

txtTitle = "ファイナルファンタジー" '//テキストボックスへの代入となり、次の式と等価
Me.txtタイトル.Value = "ファイナルファンタジー" 
MsgBox Me.txtタイトル '//"ファイナルファンタジー"が表示される

txtTitle.SizeToFit '//Me.txtタイトル.SizeToFit として動作する

※ACCESSのテキストボックスにはCopyメソッドがないので2番目の例でもtxtTitle.Copyはエラーになる(ACCESSからクリップボードを操作するのはめんどくさいです)

ex)ラベルコントロールを変数にしたい

Dim myLbl As Label
Set myLbl = Me!lblタイトル
myLbl.ForeColor = RGB(255, 0, 0)
3

そちらのフォームの状況が分からないので、下記のようだと想定してコーディングしています。

メインフォーム
名前 商品フォーム
商品フォームのレコードソースのテーブル(商品テーブル?)に「最新購入日」フィールドがある。

サブフォーム
名前 サブ案件フォーム
レコードソース T_案件
T_案件 には「購入日」フィールドがある

①VBA内の「Me!最新購入日」については「サブフォームコントロール名.Form!最新購入日」と
 しなくてよいのでしょうか。

Me!最新購入日はレコードソースの「最新購入日」フィールドになります。

If Me!最新購入日 =  Me.txt最新購入日 Then
「最新購入日」フィールドの値と「txt最新購入日」テキストボックスの値が等しいか判定してます。
「txt最新購入日」のコントロールソースは=[サブフォームコントロール名].Form![最新購入日]ですので
サブフォームの最新購入日になります。
つまり、メインフォームの「最新購入日」フィールドとサブフォームの「最新購入日」が一致しているかどうかの判定です。

②Me!最新購入日 =  Me.txt最新購入日 についてですが、
 式の左側に右側を代入するイメージだと思っていたのですが、この場合は
 Me.txt最新購入日  =  Me!最新購入日 にならないのでしょうか。

「左側に右側を代入する」であってます。
IfのElse節に入ってますので、
メインフォームの「最新購入日」フィールドとサブフォームの「最新購入日」が一致していなかったら、
サブフォームの「最新購入日」をメインフォームの「最新購入日」フィールドに代入しています。
これでサブフォームの「最新購入日」とメインフォームの「最新購入日」は常に一致していることになります。

2
どんぐり 2020/09/07 (月) 23:28:57 0029a@1c915

ありがとうございました!ところで理解力がなく申し訳ないのですが、
わからない点があり、教えていただけませんでしょうか…

①VBA内の「Me!最新購入日」については「サブフォームコントロール名.Form!最新購入日」と
 しなくてよいのでしょうか。
②Me!最新購入日 =  Me.txt最新購入日 についてですが、
 式の左側に右側を代入するイメージだと思っていたのですが、この場合は
 Me.txt最新購入日  =  Me!最新購入日 にならないのでしょうか。

5
トマト 2020/09/07 (月) 23:17:00 0029a@1c915 >> 4

>今回の質問も雰囲気的には数値型に変えてしまってもいいように見えます

アドバイスありがとうございます。見た目が数値なのに数値とテキストが混ざっていると
自分も勘違いしたり引継時にもわずらわしいかなと思って悩んでいました。
全て数値に合わせる方向で検討してみようかと思います。
ありがとうございます!

4
セロハン 2020/09/07 (月) 22:57:59 0029a@1c915 >> 1

こちらでバッチリ思い通りのものができました。ありがとうございました。

3

MSForms.DataObjectオブジェクトを使うとクリップボードのデータを直接取得でしたり設定できます。

クリップボードとデータのやりとりをする:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

1

デザインビューで高さを調整したいコントロールを選択して、リボンの[サイズ/間隔]→[自動調整]をクリックするとフォント高にあった高さに調整されます。
こういうことでしょうか?

14
セロハン 2020/09/07 (月) 17:51:45 0029a@1c915

なぜ頭にANDがついているのか疑問だったので、6の件と共にようやく理解できました。
丁寧に解説していただき、助かりました。
「dbText」も何かわからず、逆にネットで検索して10にしてしまっていたのですが、同じものだったのですね…教えていただきありがとうございます!

2
hiroton 2020/09/07 (月) 17:14:56 2d6b2@f966d

クリップボード弄るあれこれ調べてたんですけどパッとしないですねぇ

Dim strClip As String

If Nz(Me!txtデータ) = "" Then
    'クリップボードのデータをコピー'
    Me!txtデータ.SetFocus
    DoCmd.RunCommand acCmdPaste
    Me.Recalc 'これを入れないとコード実行中に張り付けた値が反映されない'
End If

If Nz(Me!txtデータ) = "" Then Exit Sub

strClip = Me!txtデータ
Me!txtデータ = Null

'クリップボードのデータを削除'
CreateObject("WScript.Shell").Run "cmd /c ""echo off | clip""", 0

「クリップボードからの直接取込」または「txtデータに入力からの取込」の両方に対応して、2重取込防止(取込実行でtxtデータとクリップボードを消去)みたいなイメージで