Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,801 から 4,840 までを表示しています。
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なのですね…忘れないようにしなければ…
ところで、やはりフォルダパスはテーブルに格納する必要がありますよね。
このテーブルはこのフォルダパスのためにしか存在していないのですが、アクセスではテーブル以外にデータを入れる場所はありませんよね。

1

そして、「案件フォーム」でボタンをクリックするとフォルダパス+「各レコードごとに生成したファイル名」でリンクを繋ぎ、ファイルの移動に役立てたいと思っています。

このファイルの移動はどのようにしてますか。
VBAなら、クエリで生成しなくても、VBAのコードで生成すればいいだけでは。

Dim FilePath As String

FilePath = DLookup("フォルダパス","トップテーブル") & Me!ファイル名
10
トマト 2020/09/01 (火) 15:05:34 0029a@1c915

ごめんなさい。一部うつしまちがっていました。
こちらでお願いいたします。

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

9
トマト 2020/09/01 (火) 15:00:56 0029a@1c915

スミマセン、うまくいかないのでコピペします。

INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 INNER JOIN T_送付 ON T_案件.案件NO = T_送付.送付用案件NO
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.処理月)<DateSerial(Year(Date()),Month(Date())+1,1));

実際のSQLから不要なところを抜いていますので、もしかするとおかしなことになっているかもしれません。気を付けたつもりなのですが、その際は申し訳ありません。

8
hiroton 2020/09/01 (火) 14:26:24 e6ef5@f966d

この先は実際のクエリを提示してもらわないと何ともですが、
「案件テーブルの案件ID」と「送付状テーブルの案件ID」を一対多で結合して、[送付状テーブル].[案件ID]フィールドの抽出条件を「Is Null」とすればいいのではないかと思います

クエリは[ホーム]タブの[表示]からSQLビューとデザインビューが切り替えられるので、SQLビューに切り替えて表示されるテキストをコピペすると話がスムーズに進みますよ

7
トマト 2020/09/01 (火) 14:25:20 0029a@1c915 >> 6

よく理解できました。ウッカリしておりました…ありがとうございます。

6
hiroton 2020/09/01 (火) 14:02:37 e6ef5@f966d >> 1

とりあえず

②追加の質問ですみません。

のほうへの回答ですが、Date()は今日の日付を表す日付型のデータですね。めんどくさい言い方をすると、1899/12/31を1として、今日まで1日ごとに1を加算した数値を返します。これを何らかの方法で日付として表示すると2020/09/01のように画面上では見えるわけです

Left()文字列に対して左からn文字を取り出す関数ですね。Date()文字列ではないので自動の型変換が起こります
結果どうなるかというと、
Left(Date(),7)Left("44075",7)(Date()=2020/09/01の場合)として処理されます。クエリの結果が同じになるのはたまたまですが、「今月のデータを抽出したい」という要求を満たせないのは一目両全ですね

日付型は人間にわかりやすい見た目をしていても内部では数値で扱われているということを覚えましょう

日付型のフィールドで具体的に「今月」で抽出するなら

>=DateSerial(Year(Date()),Month(Date()),1) And <DateSerial(Year(Date()),Month(Date())+1,1)

と、期間指定で抽出する形になります

5
トマト 2020/09/01 (火) 13:00:45 0029a@1c915 >> 4

ありがとうございます。
基本的に毎回フォームを開く際に追加クエリが起動しているので
重複データがあってのメッセージなのですが、
やはり非表示にはしないほうがいいですよね…

4

メッセージを表示しないようにするは簡単ですが、

「追加クエリで全てのデータを追加できません」が発生する原因を特定して、それが発生しないようにすべきだと思いますがどうでしょうか。
原因がわかっていて、別に影響かないことを確認済みならいいですが。

対症療法て症状を見えないよう(メッセージ非表示)にして、気が付かないうちに病理が進行していてとんでもないことになっていないか不安です。

3
トマト 2020/09/01 (火) 12:52:50 0029a@1c915 >> 2

※補足
>2つのテーブル
案件テーブルと送付テーブルになります。
>外部の3パターン
結合の3パターンの間違いです。

2
トマト 2020/09/01 (火) 12:50:40 0029a@1c915 >> 1

早速のご回答ありがとうございます。
①>メッセージの内容が不安なら追加クエリできちんと追加できるデータだけに絞り込めばいいでしょう

おっしゃるとおりで、そうしたいと思っていたのですがうまくできずインデックスに頼った次第です。
追加クエリ「案件ID」フィールドの抽出行に「<>[T_送付]![送付用案件ID]」と入れたところパラメータの入力ボックスが表示されました。それ以外にも、クエリの上の画面に2つのテーブルを表示させ、外部の3パターンでつないでみたり色々試してみたのですが、望みの結果が得られませんでした…
どうすれば案件IDが重複しないように追加クエリを実行することができるのでしょうか。

②追加の質問ですみません。今月データを抽出する際、日付の入ったフィールドのクエリの抽出行に「Like Left(Date(),7) & "*"」と記載しても「Left(Date(),7)」と記載しても結果が同じで不思議に思っています・・なぜなのでしょうか。

1
hiroton 2020/09/01 (火) 11:58:25 e6ef5@f966d

メッセージの内容が不安なら追加クエリできちんと追加できるデータだけに絞り込めばいいでしょう

メッセージそのものを出したくないのならメッセージ表示の設定を切り替えればいいです
オブジェクトの削除とアクションクエリの確認メッセージを有効または無効にする

2
肩こり慢性 2020/09/01 (火) 11:04:45 0029a@1c915

うまくいきました!初歩的なミスでスミマセン。ありがとうございました。

1
UPDATE Q_案件 SET Q_案件.担当ID = Forms![フォーム名]![cbo担当];

としてください。
フォーム名は実際のものにしてください。

7

確認しました
指示通りやったらきれいになりました
「代替の背景色」を「代替の行」などの兼ね合いで線が少し消えたりしていたのでしょうか?

後学のために教えていただきたいのですが

Left = -20
Width = Me.ScaleWidth + 20
はそれぞれ詳細から少しはみ出して線を書くためとわかりました

Top = Me.Height - 8
Height = Top
はなぜ高さから引くのですか?
足して高さより少し下からラインを引くのではないでしょうか?

4
ポンタ 2020/08/31 (月) 00:47:57 0029a@1c915 >> 3

上記記載内容で、Accessで使えるマクロを公開しているサイトを見つけ、解決いたしました。
すみません、ありがとうございました。

3
ポンタ 2020/08/31 (月) 00:29:41 0029a@1c915

フォルダの存在確認
おかげさまで、フォルダのコピーはできるようになりました。
欲張って、該当のフォルダがあるかどうかをファンクション関数を使って確認したいと思い
上記のサイトのDir関数を参考に
標準モジュールにファンクション関数をはって、「Sub IsExistDirA利用例()」を
フォームのボタンクリックに入れてみましたが
「SubまたはFunction定義がされていません」とエラーが出ます。

AccessとExcelの違いがありますでしょうか…
欲張った質問で申し訳ありません。

6

ありがとうございます
明日コードをためさせていただきます

それにしてもなぜ太さがかわるんですかね

Me.DrawWidth = 1
だと太さは変わらないかもしれませんね
それも踏まえて明日試してみます

5

「代替の背景色」を「代替の行」にした場合、いろいろ調整して下記のようにすると、太さの差はほとんど目立たなくなりました。

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    Dim Left As Single
    Dim Top As Single
    Dim Width As Single
    Dim Height As Single

    Me.ScaleMode = 1

    Left = -20
    Top = Me.Height - 8
    Width = Me.ScaleWidth + 20
    Height = Top

    Me.ForeColor = RGB(0, 0, 0)
    Me.DrawWidth = 7

    Me.Line (Left, Top)-(Width, Height)
End Sub

線の両端は丸くなるのは、線の左端と右端を、詳細セクションからはみ出るように設定することで解決できるようです。
また、高さは線の太さよりすこし大きめの数値を引くとよさそうです。

4

「代替の背景色」を設定しているようですが、これを「色なし」に設定したらどうなりますか。

「代替の背景色」はたいてい「色なし」にしているのでそれで試していましたが、色を設定したら、太さが変わるという現象が発生しました。