Microsoft Access 掲示板

views
4 フォロー
6,349 件中 4,881 から 4,920 までを表示しています。
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

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

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

3

ペイントで切り貼りしたところやはり線の太さも違うようです
画像
コードで書いたので同じラインが引かれるはずですが不思議です

このサイト様で、レコードがない部分にも枠線を書くというテクニックがありますが
あちらでは正常に表示されていましたでしょうか?
私ほど神経質に見る人もそんなにいないのか気にならないだけでしょうか?

2

やってみましたがやはりおかしくなります
画像では視認しやすいように太さを7に設定しました
画像
画像のように行により若干太さも変わり左先端がまちまちの不揃いになってしまいます

右端は丸みを帯びた先端ですがやや不揃いです
画像

原因がわかりますでしょうか?
よろしくお願いいたします

1

その現象は発生するのは、画面上ですか、それとも実際に印刷したときですか。

とりあえず当てずっぽうですが、

   Left = Me.ScaleLeft + 10
   Top = Me.Height - 10

としたらどうですか。この数値を増減させてみて変化はありますか。

5
とり 2020/08/29 (土) 11:39:50 bb981@b3e19

同じようなエラーが出てました。
私の場合、あるフォーム1のボタンをフォーム2にコピペして、マクロビルドしたら、フォーム2でエラーになりました。コピペではなく、フォーム2でボタンを新規作成さしたら正常に動きました。

16
nokonoko 2020/08/28 (金) 11:34:11 653a6@54883

わかりました。ありがとうございました。

2
ポンタ 2020/08/28 (金) 09:58:35 0029a@1c915

ありがとうございました。教えていただいたURLを参考にコードを作成してみます!
作成した後、壁にぶちあたったら具体的なソースをアップして相談させていただきます。

1
名前なし 2020/08/28 (金) 09:33:52 c6165@f966d

②についてがわかりません・・・

問題はなるべく細かくすると解決の糸口も広がります(回答側としてどこまで「これはできるだろう」と思っていいのかわからないので悩みます)

②-1.アクセスの帳票で登録している各レコードフォルダパスを取得する
VBAでRecordsetを操作するのが王道です。これも「わからないこと」ですか?
解説しているサイトも多いので適当に検索してみるといいです。これについても回答が欲しいのであれば具体的なデータ(テーブル名、フィールド名、実際に操作するタイミング(フォーム名、ボタン名)等)を上げてください

②-2.ACCESSでファイルの保存をする
VBAでのフォルダ・ファイル操作について、公式ドキュメントなら
ディレクトリとファイルのキーワード サマリー
FileSystemObject オブジェクト
あたりですが、さすがにアレなので有名どころをひとつ

VBAでファイルの操作(Office TANAKAさん)
EXCEL VBAの内容ですが大部分はACCESSでも同じです

15

弊害というかフォームで使える機能が使えないということです。
例えば、更新前に入力値をチェックするとか、いろいろ細かい制御がフォームならできます。

14
nokonoko 2020/08/27 (木) 17:27:46 653a6@54883

 サブフォーム内のコードでレコードを更新するようなことをしていませんかね。
連結コントロールに値を代入するとか。

サブフォームにはイベントやコードがありませんでした

フォームの「レコードロック」プロパティを「すべてのレコード」に設定しているとか。

All Records(すべてのレコード)になっていました。
No LocksまたはEdited Recordに変更したら、Error3008が消えました。
つまり、解決しました。ありがとうございます。
そのプロパティをいじったことがなかったので、勉強します。

ソースオブジェクトをクエリにすると、フォームで使えるいろいろな機能が使えなくなる

そうなのですね。どういう弊害が出るのでしょうか。

13
hatena 2020/08/27 (木) 14:31:48 修正 >> 12

サブフォーム内のコードでレコードを更新するようなことをしていませんかね。
連結コントロールに値を代入するとか。

あるいは、フォームの「レコードロック」プロパティを「すべてのレコード」に設定しているとか。

ソースオブジェクトをクエリにすると、フォームで使えるいろいろな機能が使えなくなるので、将来、機能を拡張したいときに困るかもしれません。

12
nokonoko 2020/08/27 (木) 13:16:48 653a6@54883

開発中で、完全にローカルサイトです。(データすら共用していません)
ほかのコードで開いていることもないような気がします。
昨日の報告通り、サブフォームをほかのフォームの埋め込みから、ソースオブジェクトをクエリに変更したところエラーの発生がなくなりましたので、(どういうことは私にはわかっておりませんが)、とりあえずこのやり方で構築していきます。

ありがとうございました。

10

罫線の描画に関しては Access の弱点の一つですね。
太さの細かい調整が難しいし、プリンターが変わると太さが変わったりとか、、、
私はこの点に関してはある程度妥協しています。

この点に拘りがあるなら、エクセルにエクスポートしてエクセルの方で印刷するようにした方がいいと思います。

11

エラー3008(T_Seihin_Torihikiが排他的に開かれている、云々)

どこかでT_Seihin_Torihikiを排他的に開いているということですので、コードのどこかで開いているとか、あるいはマルチユーザーで共有していて他のユーザーが開いているとか、・・・何か心当たりはないですか。

9
ひよ 2020/08/26 (水) 17:55:05 8e098@02840

そして実際の印刷とデザインレイビュー以外では正常に表示されませんね(いろんな太さを何本か並べていますが消えるものがあります)