Microsoft Access 掲示板

6,622 件中 5,121 から 5,160 までを表示しています。
2

コードをよろしくおねがいします

1

基本的には目分量ですることになります。
もし、コントロール数が多くて大変という場合は、VBAで位置調整する方法もありますが、Accessの場合は1レコード分の位置調整だけなのでそれほど手間ではないと思いますが。

もし、ご希望ならVBAで位置調整するコードを提示できますけど。

3

あ!それぞれ別のテーブルの主キーということですね。よくみたらそう書いてありますね。
一つのテーブルにフォームから入力したり、インポートしたりすると読み違えてました(;^_^A

なら、それぞれのテーブルに適したデータ型にすればいいので、現状でも問題ないです。

ただ、外部のデータの場合、仕様が変わったりデータミスがあったりする可能性があるなら、別にオートナンバー型フィールドを追加して主キーにした方かいいかも知れません。
また、追加順が必要な場合もオートナンバー型のフィールドは必要ですね。インポートした場合、Accessは入力順を保持しないので。

1
hatena 2020/09/05 (土) 12:08:38 修正

商品フォームのレコードソースのテーブルに「最新購入日」のフィールドは作成済みですか。
作成していない場合は作成してくださいね。

そこで、コントロールソースとして
=DMax("購入日","T_案件","商品NO=forms![F_商品]![txt商品NO]")
と記載しております。

これでも、最新購入日は表示されますが、
サブフォームでレコードを追加したり、購入日を編集しても、反映されませんよね。
反映された方がいいですよね。

サブフォームのフォームヘッダーかフッターにテキストボックスを配置して下記のように設定します。

名前 最新購入日
コントロールソース =Max([購入日])

メインフォームの最新購入日を表示するテキストボックスは、下記のように設定します。

名前 txt最新購入日
コントロールソース =[サブフォームコントロール名].Form![最新購入日]

これで、サブフォームで更新、追加して確定すると即反映されます。

これができたら、メインフォームの更新前処理のイベントプロシージャを下記のように記述します。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me!最新購入日 =  Me.txt最新購入日 Then
    Else
       Me!最新購入日 =  Me.txt最新購入日 
    End If
End Sub

これでテーブルに反映されます。

9
ポンタ 2020/09/05 (土) 11:46:55 0029a@1c915

お忙しいところお返事ありがとうございます。
そのままのコードをのせることが難しいのですが、
時間ができ次第、改めてわかりやすくまとめたいと思っています。
そのときは、またよろしくお願いいたします。

2
トマト 2020/09/05 (土) 11:01:24 0029a@1c915

わかりづらく、すみません。
以下のような形です。(実際はもっとテーブルがあるのですが)
テーブルB,Cにおいてオートナンバー型のフィールドを追加し、
主キーとした方がよいということでしょうか。
今のところ桁数もバラバラですが、わかりやすいようにあわせたりしますでしょうか。

●テーブルごとの主キー
テーブルAの商品ID 01(オートナンバー型の数値フィールド)
テーブルBの顧客ID 0001(外部のデータを常に既存のテーブルに追加インポート。短いテキスト)
テーブルCの会社ID 0001(外部のデータを常に既存のテーブルに追加インポート。短いテキスト)
テーブルDの担当者ID 001(オートナンバー型の数値フィールド)

1

Acc2016なら条件付き書式4件以上でも追加できるはずです。(最大何件かまでは把握してませんが。)
3件まではかなり前のバージョンだったと思います。

最初に条件付き書式を削除してから、追加してますか。

実際のコードを提示してください。

1

実務では、このように混在させることはよくあることなのでしょうか?

ないです(キッパリ)。

ただ、その説明では曖昧な部分があるので、下記の点について補足してもらえますか。

数値は、フォーム入力データでオートナンバーです。

この「オートナンバー」というのは「オートナンバー型」のフィールドという意味ではなく、
VBAかなんかで自動採番する機能を実装しているという意味ですよね。

短いテキストは、元データがあってひっぱってきたID

外部のデータを既存のテーブルに追加インポートしたということですか。

あと、具体的に主キーフィールドにどのような値が格納されているか例示してもらえますか。

たぶん、下記のような設定にすればいいとは思います。
オートナンバー型のフィールドを追加してそれを主キーとする。
外部データのID(テキスト型)、フォームで自動採番したID(数値型) はそれぞれ別のフィールドにする。

1
トマト 2020/09/04 (金) 15:11:16 0029a@1c915

こちらのバグ…なおりました。
全てのテーブルをXML形式でインポートしなおしたつもりでしたが、1つずつ確認していたところ関係なさそうなテーブルが漏れていたので、インポートしなおしたところ、エラー表示が出なくなりました。
この件で数時間トライ&エラーの繰り返しだったので、またすぐに発生するような気がしてトラウマ気味です。

3

操作しているフォームから、他のフォームを操作するには、Forms!かと思いましたが、

その認識で合ってますが、Forms!で参照する場合はフォームは開いている必要があります。
今回は、開く前に確認したいので、フォームのレコードソースのクエリの該当レコードのフィールド値を参照するために、
DLookup関数を使ったということです。

2
hideki 2020/09/03 (木) 17:27:26 09c37@96514

回答ありがとうございます。
Sub または、Functionが・・・・ で、反転するコード自体が無かったので、
hatena様の仰るとおり、コード自体に問題があると思っていました。

操作しているフォームから、他のフォームを操作するには、Forms!かと思いましたが、
提示されたコードでできるんですね。
勉強になりました。
ありがとうございました。

8
hatena 2020/09/03 (木) 15:59:36 修正

Private Sub から書いてもらえますか。

    Dim aName As String: aName = Test1.txt
この Test1.txt ってなんですか。

    Dim fText As Stirng: eText = "test5\"
    Dim gText As String: fText = "test6\"

ここは、

    Dim fText As Stirng: fText = "test5\"
    Dim gText As String: gText = "test6\"

の書き間違いですか。

正常に動いているものに対して、一括置換しました。

正常に動いているものをそのままコピーして貼り付けてもらうのはダメですか。

あと、どのようなことをしたいのか箇条書きの文章で説明してもらえますか。
それから汎用にする場合、どこが変化して、どこが共通なのか分かるように説明してください。

このようにやりたいことを分析して他人にも伝わるよう整理することはプログラミングにおいて大切なことです。
人間に伝わらないことを、それより融通のきかないコンピュータに伝えて正しく動作させることは不可能です。

1

提示されているコードにも問題がありますが、「Sub または、Functionが・・・・」というエラーがでるなら、それは別の部分のエラーである可能性が高いですね。
そのエラーがでたときに、「デバッグ」をクリックしたときに反転表示されるコードの前後も提示してください。

とりあえず提示されている部分を修正するなら、

IF DLookup("レコードロック", "Q_顧客データ", "顧客ID=" & Me.顧客ID)= True Then
    MsgBox "他人が利用中です。"
Else
    DoCmd.OpenOpen "F_詳細データ", , , "顧客ID=" & Me.顧客ID
End If
4
トマト 2020/09/03 (木) 15:16:52 0029a@1c915

そうだったんですね…大変失礼いたしました。ありがとうございました。

2
ワッフル 2020/09/03 (木) 13:41:01 f4a02@7602d

迅速なご返答ありがとうございます。
それから、ご返信が遅れてしまい、
まことに申し訳ございません。

リッチテキストについてちょっと調べてみようと
思います。

まだ、よく理解できないようなら、
ここにまた質問させてください。

7
ポンタ 2020/09/03 (木) 12:15:02 0029a@1c915
Dim aName As String :aName = test1.txt
Dim bPath As String :bPath = "C:\Users\me\Desktop\test2
Dim cPath As String :cPath = "C:\Users\me\Desktop\test3"
Dim dText As String :dText = "test4\"
Dim fText As Stirng :eText = "test5\"
Dim gText As String :fText = "test6\"

    If IsNull(Me.txt●●) Then
    MsgBox gText & "を記入してください"
    Exit Sub
            ElseIf AcDir(bPath, vbDirectory) = "" Then
            MsgBox "フォルダが存在しません。"
            Exit Sub
                 ElseIf AcDir(bPath & "\" & aName, vbNormal) = "" Then
                 MsgBox aName & "が見つかりません。"
                 Exit Sub
                      ElseIf AcDir(cPath & "\" & dText, vbDirectory) <> "" Then
                      FileCopy bPath & "\" & aName, cPath & "\" & dText & "\" & aName
                      Shell "Explorer.exe " & cPath & "\" & dText & "\", vbNormalFocus
                      Exit Sub
                            ElseIf AcDir(cPath & fText, vbDirectory) <> "" Then
                            MsgBox "「" & dText & "」フォルダが見つかりません。「" & fText & "」フォルダに保存します。"
                            FileCopy bPath & "\" & aName, cPath & "\" & fText & "\" & aName
                            Shell "Explorer.exe " & cPath & "\" & fText & "\", vbNormalFocus
                            Exit Sub
                                Else: MsgBox "「" & dText & "」「" & fText & "」フォルダのどちらも見つかりません。"
                                         Shell "Explorer.exe " & cPath, vbNormalFocus
                                
    End If
    End Sub

一応、私の確認したところでは正常に動いているものに対して、一括置換しました。
不備あれば申し訳ありません。

3

そのコードだと開いてないとダメですね。
下記のコードだと開いてなくても、開いていても大丈夫です。

開いてない場合、フィルターがかかった状態で開きます。
開いている場合は、そのフォームがアクティブになってフィルターがかかります。

Private Sub btn今月分_Click()
    Docmd.OpenForm "F_注文", , ,"売上日 Between #" & Date & "# AND #" & DateAdd("m", 1, Date)-1 & "#"
End Sub
2
トマト 2020/09/03 (木) 11:52:22 0029a@1c915

別のフォームです。フォームは開いていません。
開いていないとダメなんでしたっけ…理解不足で申し訳ありません。。

11
名前なし 2020/09/03 (木) 11:36:14 09c37@96514

ご回答いただきましてありがとうございました。
返信がおくれて大変申し分けありませんでした。
本当に感謝します。
ありがとうございました。

1

「F_注文」フォームはコードが記述してあるフォームとは別のフォームですか。
サブフォームではないですか。

別のフォームの場合、そのフォームは開いていますか。

6

提示のコードでは変数に値が代入されていないので、正常には動かないですよね。
実際にボタンのクリック時に記述している正常に動くコードを提示してもらえますか。

5
ポンタ 2020/09/03 (木) 07:57:45 f1ed8@025a2 >> 2

MsgBox bPath &"が見つかりません。"

MsgBox bPath & aName &"が見つかりません。"

4
ポンタ 2020/09/03 (木) 07:49:40 f1ed8@025a2 >> 2

元々変数を使っていなかったところを、昨夜変数にしたのですが、部分的に変換間違いでおかしいところがあるようです…スミマセン。

3
ポンタ 2020/09/02 (水) 21:05:22 0029a@1c915 >> 2

AcDirは、下記サイトを採用させていただいております。
https://www.feedsoft.net/access/tips/tips47.html

2
ポンタ 2020/09/02 (水) 20:32:50 0029a@1c915 >> 1

ありがとうございます。
コードを記載します。

    Dim aName As String
    Dim bPath As String
    Dim cPath As String
    Dim dText As String
    Dim fText As Stirng
    Dim gText As String

    If IsNull(Me.txt●●) Then
    MsgBox dText & "を記入してください"
    Exit Sub
            ElseIf AcDir(bPath, vbDirectory) = "" Then
            MsgBox "トップページに保存しているフォルダが存在しません。"
            Exit Sub
                 ElseIf AcDir(bPath & aName, vbNormal) = "" Then
                 MsgBox bPath & "が見つかりません。"
                 Exit Sub
                      ElseIf AcDir(cPath & fText, vbDirectory) <> "" Then
                      FileCopy bPath & aName, cPath & fText & "\" & aName
                      Shell "Explorer.exe " & cPath & fText & "\", vbNormalFocus
                      Exit Sub
                            ElseIf AcDir(cPath & gText , vbDirectory) <> "" Then
                            MsgBox "「" & fText &"」フォルダが見つかりません。「" & gText &"」フォルダに保存します。"
                            FileCopy bPath & aName, cPath & gText & "\" & aName
                            Shell "Explorer.exe " & cPath & "gText & "\", vbNormalFocus
                            Exit Sub
                                Else: MsgBox "「"& fText & "」「" & gText & "」フォルダのどちらも見つかりません。"
                                         Shell "Explorer.exe " & cPath, vbNormalFocus
                                
    End If
    End Sub```
1

返り値が必要ならFunctionプロシージャ、返り値が必要なければSubプロシージャを使えばいいでしょう。
とくに返り値がなくても処理が成功したか、失敗したかを返すためにFunctionにすることはよくあります。

具体例があったほうが分かり安いと思いますので、現状の「ファイル1を保存する」のコードを提示してもらったら、それをもとにどのように汎用関数(プロシージャ)にするか説明できると思います。

4
セロハン 2020/09/02 (水) 13:39:35 1d451@2d897

本当にすみません。なぜか単票に切り替わっていました。帳票で表示されるようになりました!!!
また絞込み等で不明な点出て来たら質問させていただきます。
ありがとうございました!

3
セロハン 2020/09/02 (水) 13:19:39 1d451@2d897 >> 2

メインフォームで表示件数を(Dlookup)表示させているのですが、件数はあっているようです。
実際は1件しか見えません・・??

2
セロハン 2020/09/02 (水) 13:15:26 1d451@2d897

ありがとうございます。サブフォームは必要ないとの理解で、
下記のコードにしてみたのですが、検索結果が帳票の1件だけとなります。
なぜでしょうか

'独立したポップアップフォームからメインフォームを参照する'
Forms!メインフォーム.form.filter = strFilter

1
hiroton 2020/09/02 (水) 12:56:24 cc44d@f966d

サブフォームにする必要はなく、それぞれ独立したフォームとして作成します。検索フォームはフォームのプロパティでポップアップとして表示されるよう設定しておきます

メイン-サブの関係であれば

Me!サブフォーム.form.filter = strFilter

のように、メイン(Me)からサブフォームのフィルタープロパティにアクセスできますが、フォームが独立している場合はしっかりフォームを指定する必要があります

'独立したポップアップフォームからメインフォームを参照する'
Forms!メインフォーム.form!サブフォーム.form.filter = strFilter

Me(自分自身)ではないので、きちんと名前を使って相手を特定するという部分に注意すれば問題なく作成できると思います

12
トマト 2020/09/02 (水) 10:48:11 0029a@1c915

確かに「>」が抜けてました(うっかりミスです。)…ご指摘いただき助かりました。
その他の部分もあれこれやってもうまくいかず悶々としておりましたが、これでスッキリしました!

7
ポンタ 2020/09/02 (水) 09:36:29 0029a@1c915

高度な技を教えていただきありがとうございます!!
大変勉強になりました。今後も使える技で、とても助かります。

>「トップフォーム」を閉じない(不要の場合は、閉じずに非表示にておく)
ここらへんの設計は後回しにしているので、いずれ質問させていただくかもしれません。。

6
hiroton 2020/09/02 (水) 08:14:25 cc44d@f966d

あとは、VBAでグローバルな変数を用意するとかですかね

また、クエリからも [TempVars]![FolderPath] という式で参照できます。

「案件フォーム」のレコードソースで「ファイルパス: [TempVars]![FolderPath]&ファイル名」なフィールドを用意しておけるとかなかなか良さげですね

9

なるほど理解できました
ありがとうございます

8

セクションの高さの位置に描画すると、太い場合はセクションの範囲からはみ出るので、はみ出ないようにすこし上に移動させるという意味になると思います。

下記のようなイメージだと思ってます。
画像1

5

アクセスではテーブル以外にデータを入れる場所はありませんよね。

マクロの「一時変数」というのがあります。
"SetTempVar/一時変数の設定" マクロ アクション - Access

VBAからは、TempVars オブジェクト として参照できます。
TempVars オブジェクト (Access) | Microsoft Docs

下記のような感じで使えます。

    '一時変数登録
    TempVars.Add "FolderPath", "C:\test\" '変数名 FolderPath にパス「C:\test\」を登録
    
    
    '一時変数参照
    Dim FilePath As String
    FilePath = TempVars!FolderPath & "vvvvv" 'Me!ファイル名
    MsgBox FilePath

TempVars!FolderPath の部分は TempVars("FolderPath") とすることもできます。TempVars(0) とインデックスで参照することなできます。

データベースファイルを閉じるまでは、使用できます。
マクロで参照したり、フォーム、レポートのコントロールソースからも下記のような感じで参照できます。

=[TempVars]![FolderPath]

また、クエリからも [TempVars]![FolderPath] という式で参照できます。
なかなか便利な機能だとおもいます。

まとめると、
「トップフォーム」を閉じない(不要の場合は、閉じずに非表示にておく)なら、「トップフォーム」に表示のテキストボックスを配置してそこに格納しておく。

「トップフォーム」を閉じる場合があるなら、TempVars に格納しておく。

データベースファイルを閉じても、保存しておきたい。次に開いたとに前回のものを参照したいという場合は、テーブルに格納しておく。

というように使い分けるといいでしょう。

4
ポンタ 2020/09/01 (火) 18:01:44 f1ed8@69bfc >> 3

なるほど、よくわかりました。
トップに置きたいのですが、閉じる可能性があるので今回はやめておこうと思いますが、今後の参考になりました!
ありがとうございます!!

3
hiroton 2020/09/01 (火) 17:34:50 e6ef5@f966d

厳密な話をしだすとアレですが、一時的に使うだけなら

DLookupする代わりにフォルダパスを指定するダイアログをこのタイミングで呼び出す(VBAのみでフォルダパスを扱う)

案件フォームに非連結の「フォルダパス」テキストボックスを設置して、フォルダパス格納機能も案件フォームに設置する

'案件フォームにフォルダパスを一時確保'
Dim folderPath As String
folderPath = (フォルダパス取得処理)
Me!フォルダパス = folderPath
'ファイル移動処理の中ではフォーム上のフォルダパスを参照'
FilePath = Me!フォルダパス & Me!ファイル名

フォルダパス取得を「トップフォーム」でやりたいのならフォルダパス取得部分は上記同様にトップフォームに作って、案件フォームからトップフォームを参照する

'トップフォームが開かれたままでないとエラーになる'
FilePath = Forms!トップフォーム.form!フォルダパス & Me!ファイル名

など、アクセスを終了したら保存しなくてもいいデータならテーブルにもつ必要はないですね

11
hiroton 2020/09/01 (火) 16:49:41 e6ef5@f966d

結合の設定が正しくできてないですね
結合プロパティで「'T_案件'の全レコードと'T_送付'の同じ結合フィールドのレコードだけを含める。」にチェックを入れましょう

INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 LEFT JOIN T_送付 ON T_案件.案件ID = T_送付.送付用案件ID
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And T_送付.送付用案件ID Is Null;


「月」フィールドについて
日付型にしたフィールドで「2020/09」のように「(年)月」だけを保存しようとすると、データとしてはその月の1日とした日付で保存されます(厳密に「月」だけを指定したデータとしては保存できません)
この仕様のもとデータ管理が完璧なら抽出条件は上に挙げたように(T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) だけで満たせますが、「日付型」にしたフィールドで指定していない日付部分はどうなってるかわからない的な怖さがあるのでちゃんと範囲指定してあげたほうがいいと思います

(T_案件.月)>=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.処理月)<DateSerial(Year(Date()),Month(Date())+1,1))

2
ポンタ 2020/09/01 (火) 16:37:27 0029a@1c915

ばっちりです!こういうときのためのDLookupなのですね…忘れないようにしなければ…
ところで、やはりフォルダパスはテーブルに格納する必要がありますよね。
このテーブルはこのフォルダパスのためにしか存在していないのですが、アクセスではテーブル以外にデータを入れる場所はありませんよね。