ublic Sub SetSchedule()
Dim i As Integer, rs As DAO.Recordset
For i = 1 To 42
Me("T" & i).Caption = ""
Next
Set rs = CurrentDb.OpenRecordset( _
"SELECT 日付, 時刻, 略, 氏名 FROM T予定 WHERE " &
"日付>#" & FirstDay & "# AND 日付<=#" & FirstDay + 42 & "# ORDER BY
時刻", _
dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
With Me("T" & rs!日付 - FirstDay)
.Caption = .Caption & Format(rs!時刻, "hh:nn") & " " & rs!略 &
rs!氏名 & vbCrLf
If Me(rs!略).Value = "関" Then
Me(rs!略 & rs!氏名).ForeColor = 8388608
Else
Me(rs!略 & rs!氏名).ForeColor = 0
End If
End With
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
End Sub
一度差し込み設定をしたWord文書を作成したら、差し込み印刷の開始→標準の Word 文書でデータのリンクを解除して保存しなおします(開いてもダイアログの出ない文書にする)
都度ACCESS VBAからWord文書を開く→データソースのリンクをします
Dim wordFilePath As String
Dim objWord As Object
Dim objDoc As Object
wordFilePath = "C:\データ\さしこみ.docx"
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open(wordFilePath)
Dim accessFilePath As String
Dim strConnection As String
Dim strSQL As String
accessFilePath = Application.CurrentProject.FullName
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & accessFilePath & ";"
strSQL = "SELECT * FROM `qさしこみ用`"
With objDoc.MailMerge
.OpenDataSource _
Name:=accessFilePath, _
LinkToSource:=True, _
Connection:=strConnection, _
SQLStatement:=strSQL
.ViewMailMergeFieldCodes = False
End With
Set objDoc = Nothing
Set objWord = Nothing
SELECT
T.商品名, SUM(T.A数量) AS A数量, SUM(T.B数量) AS B数量, (A数量 - B数量) AS 差異
FROM
(SELECT 商品名, 数量 AS A数量, 0 AS B数量
FROM Aテーブル
UNION ALL
SELECT 商品名, 0 AS A数量,数量 AS B数量
FROM Bテーブル) AS T
GROUP BY 商品名;
If Me(rs!略).Value = "関" Then
を
If rs!略.Value = "関" Then
に変更してみてください。
あと、
Me(rs!略 & rs!氏名).ForeColor
もエラーになりそうです。
とのことですが、なんの色を変えたいのかよく考えてみてください。
hatena様
お手数をおかけいたします。
If Me(rs!略).Value = "関" Then
が選択されます。
エラーメッセージが出たときに、[デバッグ]ボタンを押すとどの行が選択表示されますか。
お二方ともご回答ありがとうございます。さすがです。
Aさん、Bさん、CさんともそれぞれログインIDとパスワードを設定していますので、ログインボタンでそれをトリガーにしてリンク先を切り替えるように組んでみます。
本当にありがとうございました。
たびたびになりますが、ご教授ください。
略の条件によって色を変えるように指定したいのですが、
実行時エラー2465
指定した式で参照されている”関”フィールドが見つかりません。
と表示されてしまいます。
VBAは以下になります。できれば、時間、略、氏名を一緒に変えたいのですが
よろしくお願いいたします。
ublic Sub SetSchedule()
Dim i As Integer, rs As DAO.Recordset
For i = 1 To 42
Me("T" & i).Caption = ""
Next
Set rs = CurrentDb.OpenRecordset( _
"SELECT 日付, 時刻, 略, 氏名 FROM T予定 WHERE " &
"日付>#" & FirstDay & "# AND 日付<=#" & FirstDay + 42 & "# ORDER BY
時刻", _
dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
With Me("T" & rs!日付 - FirstDay)
.Caption = .Caption & Format(rs!時刻, "hh:nn") & " " & rs!略 &
rs!氏名 & vbCrLf
If Me(rs!略).Value = "関" Then
Me(rs!略 & rs!氏名).ForeColor = 8388608
Else
Me(rs!略 & rs!氏名).ForeColor = 0
End If
End With
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
End Sub
>> 3
流石です。
ググったら類似質問回答がありました。確かにあのバックアップの真似では無理そうですね。
T'sWare Access Tips #179 ~もう1つのAccessデータベースを開く方法(COM版
CommandBars.ExecuteMsoメソッド
idMsoの調べ方
あれやこれやとやったんですけど、accde作成ダイアログにうまくSendkey出来ずに詰みますね。
【EXCEL VBA | ノート】Windowハンドルを取得して、ファイル選択ダイアログボックスを操作する
WindowsAPI関数まで手を広げれば出来るのかもしれないけれど、挫折しました。
>> 3
あぁぁ〜さすがですわ。よく練られていますね。
LostFocusではイベントをキャンセルできませんので、Exitイベントを使ってください。
自動生成されるイベントプロシージャの引数に
Cancel As Integer
がある場合はCancel = True
でイベントのキャンセルが可能です。LostFocusのイベントプロシージャは引数がないのでキャンセルはできません。50個のACCDEファイルを作成するという考え方ではなく、
ACCDEファイルの起動時にリンクテーブルのリンク先を適切に変更する処理を持たせれば、配布するACCDEファイルは一つですみます。
元のAccdbファイルに、リンクテーブルのリンクが切れていたらリンク先を変更するFunctionを作成しておきます。
変更するリンク先は、データベースファイルと同じフォルダーにあるテキストファイルにリンク先パスを格納しておいて、それを参照するようにします。
このFunctionをAutoExecマクロで起動時に実行するようにします。
最初に配布するときだけ、リンク先パスを格納したテキストファイルと一緒に配布して、同じフォルダーに入れておいてもらいます。
次回から、Accdeファイルのみ配布すれば、最初の起動時にリンク先を変更してくれます。
ファイルはリンクテーブルで構成しています。Aさん、Bさん、Cさんはそれぞれ遠く離れた別の場所にいて、別々ののサーバーで閲覧をします。しかしそれぞれが別の拠点から大元のリンクテーブルにアクセスすると動作速度が遅くなるため、それぞれのサーバーにリンクテーブルを定期的にコピーし、それを閲覧専用として利用します。そのためそれぞれの環境に応じてリンク先をVBAで変更しています。
変更したものをそれぞれコンパイルして配布しているんですが、それって結局おっしゃるとおり50個のACCDEファイルができるということになりますね。なのでボタン一つでできないかなあという相談です。
配布のやり方、やった事がないのに回答して申し訳ないですが、1回コンパイルして出来上がったファイルをコピペ配布するようなイメージを持っています。状況は、Aさんに配布する為に、1回コンパイル、続けて、Bさんに配布する為に再度もう1回コンパイル…という事なのでしょうか?それとも、例えば、50個のAccessファイルを手作業で50回コンパイルするのは大変という事でしょうか?
>> 13
>> 14
もう一度状況を整理するのはどうでしょう?具体的に不具合やエラーコードやコードを含めて質問を立て直すといいですよね。確認済みだと思いますが、ファイル名を参照してあれやこれや動作するような仕組みになっていませんよね?
本日、別の顧客でも同様の不具合が発生しました。環境は、Office365のアクセスです。同様にMDBを作成し直して、実行したところ、不具合が発生しました。原因は、ファイル名にアルファベットとアンダーバーを使用していたことでした。アンダーバーをなくし、アルファベットのみに変更したら、何度起動・終了を繰り返してもOKでした。
了解です。クエリの元になっているテーブルは、Thp_サイト登録情報でしょうか。Thp_サイト情報でしょうか。両方でしょうか。もし、片方だけならば、デザインタブ『テーブルの表示』を押して、両方表示、紐付けておくと便利ですよね。
登録キーワードは、Thp_サイト登録情報に保持する、Thp_サイト情報に保持しない。とすればいいのかもしれませんね。
以下、なんちゃってイメージです。
フィールド内の文字数を数える(LEN関数) - Accessの使い方みたいな感じと想像します。
お返事ありがとうございます。りんごさん。
>横から失礼しますね。登録キーワードは、1つのサイトに1つだけ?それとも、複数設定出来るようにするの?登録キーワードを管理するテーブルはあるの?
これは普通に複数設定できるようにしたいなと思っています。改めて考えると全く妥当ではないかもしれません…
空白を設け、羅列しても。ここは妥当ではないかも。
>何かをカウントしたいの?
これは、サイトの登録文の文字数のカウントです。クエリで設定しました。
>それと、念のために確認ですが,クエリじゃなくて、Qhp_サイト登録情報_カウントという名前のテーブルですか?
これはクエリです。クエリの時に、Qという文字列を入れて分かりやすくしております。
アクセスって奥深いですね。
hatenaさんにせっかくお返事いただいているのに、
私の頭では理解しきれず、混乱している状態です。
でも、何とか頑張りたいと思います。
>> 10
横から失礼しますね。登録キーワードは、1つのサイトに1つだけ?それとも、複数設定出来るようにするの?登録キーワードを管理するテーブルはあるの?
何かをカウントしたいの?
それと、念のために確認ですが,クエリじゃなくて、Qhp_サイト登録情報_カウントという名前のテーブルですか?
「Thp_サイト情報」がメインテーブルで、「Qhp_サイト登録情報_カウント」にメインテーブルの「登録サイト名」「登録キーワード」を表示させたいということですよね。
「Qhp_サイト登録情報_カウント」に「サイト情報ID」があるので、それをもとに、メインテーブル「Thp_サイト情報」から、「登録サイト名」「登録キーワード」を参照して表示させることが可能なので、「Qhp_サイト登録情報_カウント」には「登録サイト名」「登録キーワード」は不要です。データベースでは同じデータを複数個所に格納しないというのが原則です。
別テーブルのデータを参照する方法はいろいろありますので、その時に応じて使い分けることになります。
基本は「オートルックアップクエリ」という機能です。詳細は下記を参照ください。
Accessの「オートルックアップクエリ」とは | できるネット
これを作っておいて、フォームやレポートのレコードソースに設定すればVBAなしでメインテーブルのデータを表示させることができます。
あと、フォームなとではコンボボックスのColumnプロパティを使う方法もよく使います。
今回のフォームはコンボボックスがあるので、テキストボックスのコントロールソースに、
=サイトID.Column(1)
=サイトID.Column(2)
と設定すれば「登録サイト名」や「登録キーワード」を表示させることが可能です。
お世話になっております。
以下が情報です。
フォームのレコードソースのテーブル名、
「Qhp_サイト登録情報_カウント」
フィールド構成
「サイト登録情報ID(主キー)
サイト情報ID
登録サイト名
登録キーワード
備考1」
です。
コンボボックスの値集合ソースのテーブル名
「Thp_サイト情報」
フィールド構成
「サイト情報ID(主キー)
登録サイト名
登録キーワード
登録文
備考1」
となっております。
それではどうぞ、
よろしくお願い致します。
連結フォームなら、下記の情報を提示てしもらえますか。
フォームのレコードソースのテーブルのテーブル名、フィールド構成、主キー設定
コンボボックスの値集合ソースのテーブル名、フィールド構成、主キー設定
もっと基本的なことの確認が漏れていたんですが
差し込み印刷用のデータ ソースとしてテーブルやクエリを使用する
(
SELECT TOP1
のような)静的なクエリが組めるのであればそのままデータソースにできるのでは?ついでにサンプルを組んでいたらいろいろハマったのでその辺の情報を追記しておきます
Word文書に差し込みの設定をしておくと、ファイルを開く時に確認ダイアログ(「この文書を開くと、次の SQL コマンドが実行されます。」)が表示されます
回避方法としてレジストリを修正する方法がありますが、影響範囲が大きく望ましくありません。書式の設定だけしたWordファイルを用意して、データソースは動的に読み込むとよさそうです
MailMerge.OpenDataSource メソッド (Word)
一度差し込み設定をしたWord文書を作成したら、差し込み印刷の開始→標準の Word 文書でデータのリンクを解除して保存しなおします(開いてもダイアログの出ない文書にする)
都度ACCESS VBAからWord文書を開く→データソースのリンクをします
上記リンク先では
とありますが、hirotonの環境(office 2013)ではうまくいきませんでした。サンプルのコードではファイル指定が
.mdb
なので、古い形式でないとダメなのかもしれませんまた、
Provider=Microsoft.ACE.OLEDB.12.0;
この指定部分はACCESSのバージョンによって変わる可能性がありますプルダウン、行を選択、それぞれの列の値をそれぞれのフィールドに登録したい、という事だったのかしら。上手く汲み取れませんでしたね。
普通にすると、主キーの値をテーブルに入力することになりますよね。事前にプルダウンの元になるテーブルを用意し、AかBか適切なフィールドに主キーを設定して、登録先のフィールドに紐付けておきましょう。
プルダウンのテーブルと登録先のテーブルを主キーで紐付けしておけば、Aの値は「あ」にBの値は「い」なんて必要ないですよね。クエリで参照・表示するだけです。
以上、単独主キーの話でした。複合主キーの場合、どうするかなぁ。
ご回答ありがとうございます。
1→2→3の順で実行するという認識でおります。
作業テーブル(中間テーブル)を用意するという方法は思いつきませんでした。プログラム実行の都度上書きするということで対応しました。1レコードだけを対象にするのはSELECT TOP1でいけました。
https://oshiete.goo.ne.jp/qa/7681553.html
あたりを参考に差し込み部分のVBAを書こうと考えております。
ありがとうございました。
お返事をありがとうございます。
連結フォームみたいで、
コントロールソースにも、
値集合ソース、値集合タイプにも
データーがありました。
フォームの「レコードソース」プロパティの設定はどうなってますか。
空欄ですか、それとも、テーブル名かクエリ名あるはSQLが設定されてますか。
空欄なら、非連結フォームになります。
なにか設定されていれば、連結フォームになります。
まずは、これについて回答してください。
非連結フォームなら、hirotonさんの回答でいいでしょう。ただし、テキストボックスに代入した値は、どこにも保存されないので、それをどのようにするかは、自分で処理を構築する必要があります。
連結フォームならテーブル設計に問題がある可能性が大きいです。
あえて「正規化崩し」で冗長なデータを持たせるという設計もありますが、質問内容からそのレベルでないように感じます。
そんな気がしてたので大丈夫ですよ
「普通」が難しい表現ですが、
・コンボボックスの値はそのコントロールソースのフィールドに入力されます
・入力される値は、連結列で指定した列です
質問の内容は一般には上の意味でとられると思います。(やろうとしてることがわからない。テーブル構造おかしくない?という話になる)
コンボボックスの更新後処理イベントで追加の入力処理をしてあげればいいです
の場合、
新たにテキストボックスを設置し
とする
Column(1)
の数字は列番号(左端が0)です沢山のお返事ありがとうございます。
あんまりAccessに詳しいほどでもないので、
ご返信を見ながらも頭がこんがらがってます。
すみません。以下的を射てご返信出来て
いなかったらすみません。
フォームでの表示は、
サイトID、サイト名でプルダウンを作り
「1|嬉しいあいうえお」ですね。
そうして、
「1」をサイトIDに
「嬉しいあいうえお」をサイト名に
プルダウンの1アクションで入力したいと思っております。
可能でしょうか?
そのフォームは連結フォームでですか。非連結フォームですか。
非連結フォームなら、VBAでテーブル登録することになります。
連結フォームなら、現状のテーブル構成はなるべく実態に近い形で提示してください。
そもそもテーブル設計から間違っている可能性大です。
値を入力する場合、入力先のテーブルに加えて、そのテーブルのどのフィールドなのかの情報が必要です。「あ」はテーブル名ですか?フィールド名ですか?残りの不明な情報はどこにありますか?
また、Aに対する「あ」やBに対する「い」はどのように決まっていますか?(何を見たらわかりますか?)
全く同じ環境ではないので、断言できませんが、2箇所の顧客のところでこの問題が解決したように思えるので、報告します。ただし、この幻象は突然起こるので本当に解決したかを判断するのはもっと先になると思います。ただ、なにか参考になればと思い報告します。
サーバーのデータベースはSQLサーバー2017でODBCでクライアントと接続しています。
クライアントの環境は、Windows10で、アクセスは、2019開発版のクライアントと2013実行版の方が使用しています。元のアクセスアプリは、2003で作成したMDBです。
まず、2019で新規のデータベースMDBを作成しますが、このとき、フォルダ指定とファイル名指定のボタンを押して、ファイル種類を2000-2003のMDBを選択します。このとき重要なのが、ファイル名はすべてアルファベットにすることです。漢字が入ってると、作成しても同じ不具合が残ってしまいます。
この空のMDBに、元のMDBのテーブルからフォーム等すべてのオブジェクトをインポートします。タブ表示かウィンドウ表示かはオプションであとで選んで下さい。
それと、実行版ですが、2016の実行版ではやはり同じ不具合が残ります。2013の実行版ですとうまく行きました。
この方法で、まだ1週間しか経っていないので、本当にこれで治ったか確信できませんが、今の所2箇所の顧客で正常に動作しています。
この情報がお役に立てば喜ばしいです。
ご連絡ありがとうございます。
内容を書き込んだところ、こちらがイメージした通りのものが表示されました。
有難うございました。助かりました。
追加クエリを準備しておき、プルダウン操作で値Aが確定したら、追加クエリ1を実行、値Bが確定したら、追加クエリ2を実行。(追加クエリ1: テーブル「あ」に値Aを追加。追加クエリ2: テーブル「い」に値Bを追加。)
試していませんが、こんな感じの方向性でコードを考えるのはどうでしょう?
SQLビューに下記のように記述してください。
hatena様ご連絡ありがとうございます。
ご質問についてですが、
・各テーブル内での商品名の重複について → ありません
・Aテーブルのみ、あるいはBテーブルのみに存在する商品名 → 存在します
以上宜しくお願いします。
各テーブル内で商品名は重複している場合があるということでしょうか。
重複している場合は合計値を表示するということでしょうか。
Aテーブルのみ、あるいはBテーブルのみに存在する商品名はありますか。
ありがとうございます。できました。
ググっただけですが、取り敢えず、これはあれこれ確認出来そうです。
Setを使わずに変数にオブジェクトを設定していませんか?
変数にNothingを設定したあとに、使おうとしていませんか?
次に思い付くとすればこんな事でした。既に確認済みだと思いますが。
Set rst = Nothingは出来ていますか?
dbs.CloseとSet dbs = Nothingは出来ていますか?
最後に、かもしれない回答であれですが、アップデート不具合でしょうか。
正直、力になれませんでした。どなたかのヘルプを待って下さい。
余談ですが、レコードセットを上限まで開く実験では、カウント数には数え方があるみたいなものもヒットしました。真偽はわかりません。
フォーム:2or4。(サブフォームあり:+2or4×個数。リストボックスやコンボボックス:+0or2×個数)。
ありがとうございます。
hatena様
調べてみましたが、rst.closeは見た限りできていました。
仰るように、248個もレコードセットはしていないのですが、
お手上げ状態になっております。
りんご様
簡単に言うとデーター入力し(この時テーブルは8個開いている状態の時に、1から2件程打ち込んだ後に出てくるような状態です。あやふやな表現ですが、出てくる場面もまちまちなので申し訳ありません。
その後請求書発行の為に集計をかけるとエラー”3037これ以上データーベースはクエリを開くことができません”
となり、終了すると、閉じることはできるのですが、メッセージで、プログラム名xxxx.accdbは既に使用されているので
使用できません”出てくるのです。そのプログラムが入っているフォルダーには、xxx.laccdbが残っている状態です。
取り留めない状態です。
[ファイル]-[オプション]-[現在のデータベース]-[ドキュメントウィンドウオプション]で
「ドキュメントタブの表示」のチェックを外すか、「ウィンドウを重ねて表示する」を選択する、かのどちらかにしたらどうでしょう。
ようするに、フォームの上部(標題のところ)=「ドキュメントタブ」を表示しないようにする。
一例です。
請求書テーブル
請求書番号 主キー
請求日
請求年月
顧客コード
売上テーブル
売上ID 主キー
売上日
商品コード
単価
数量
請求書番号 ※売上入力時は入力しない
請求書テーブルをレコードソースとするメインフォームで、
請求書番号を発行、請求年月、顧客などを入力、
それをもとに売上テーブルから該当売上データをクエリで抽出する、この更新クエリで発行した請求書番号を売上テーブルに入力。
サブフォームのソースは売上テーブルでリンクフィールドは請求書番号。
請求書テーブルと売上テーブルを請求書番号で結合したクエリをレポートのレコードソースにして、請求書番号で抽出してレポート出力。
請求書メインフォームで、請求書番号発行、請求日、顧客などの必要事項を入力、
サブフォームで、今発生した売上を入力、
リンクフィールドは請求書番号なので、売上テーブルに請求書番号は自動で入力される。
レポートを請求書番号で抽出して出力。
自分がするなら上記のような設計になりそうです。
リンク先の実験ではレコードセットを248開くとエラーになっているようです。
通常、そんなにレコードセットを開く必要はないはずです。
VBAでレコードセットを開いて、使用後に閉じていないものがないか確認してみてはどうでしょう。