Microsoft Access 掲示板

views
4 フォロー
6,283 件中 5,681 から 5,720 までを表示しています。
1
hiroton 2019/12/09 (月) 08:38:18 a3af2@f966d

適当なファイルを作って試してみました(Excel2013,ACCESS2013)
ACCESSでリンクしたテーブルをデザインビューで開いてみるとExcelの「区分」の内容によって数値型だったり短いテキスト型だったりしました

何を基準にしているのかはちょっとわかりそうにもありません
ちなみに(Excelに)日時列を作って日付だけを入力して置いたら日付/時刻型になっていました

Excel側で区分の列の書式を文字列にしたら数字のみのデータでも短いテキスト型になりました

エクセルのデータをデータベースとして使いたいのならすべての列に書式を設定して「標準」を使わないようにすべきなのでしょう

7

何とか上手く作れました。有難う御座いました。

6

印刷したいクエリが同じデータベースファイル内にあるのなら必要ありません。
別のデータベースファイルにあるのなら必要になります。その場合は、開いたデータベースを閉じる処理も必要になります。

5

with e
.visible=true
d.minimizeall
.opencurrentdatabase("フルパス")

此処の部分も条件分岐事に表記が必要でしょうか?
余白設定は、入れなくて良いのは、分かりました。
印刷のやり方でクエリを一々開く必要があるかも分かりません。乱文申し訳ありません。ご教授お願い致します。

4

 VBA
a="印刷物1"
b="印刷物2"
c=msgbox(a & vbcrlf & b & "印刷しますか?")

if c=6 then
set d=createobject("shell.application")
set e=createobject("access.application")
with e
.visible=true
d.minimizeall
.opencurrentdatabase("フルパス")

with e.printer
 .leftmargin=0

end with
.docmd.echo false
.docmd.openquery a
.docmd.printout
.docmd.openquery b
.docmd.printout
.docmd echo true

.quit
end with
else
end if

大変申し訳ありません。if文が抜けていました。
if文による分岐をselect case で行いinputbox関数の戻り値を利用して多数の印刷物を印刷出来るものを作りたく思っていますが、コンパクトにするにはどうすれば良いか分かりません。条件分岐事に最小化、余白設定のコードが必要なのか、それを回避する策はあるかが分かりません。ご教授お願い致します。

3

if 分の所を inputobox関数にし分岐を多数できるようにselect case文を入れて例えば、戻り値が100なら印刷物1を印刷みたいなことをやりたいのですが、余白サイズ、インスタンス生成はその都度行う必要があるのでしょうか?

呈示のコードにはIf文はないですが?
もう少しやりたいことを具体的に説明してください。

access.application のインスタンスは一回生成して使いまわしてOKです。
余白サイズも application の Prunter に設定してあるので一回でOKです。

2

excelに記述してあります。vbs で使えるように実行時バインドで記述してあります。宜しくお願い致します。

1

このVBAはAccessファイルに記述してあるのでしょうか。それともExcelなど他のOfficeのファイルに記述してあるものでしょうか。

4
hiroton 2019/12/06 (金) 18:41:52 78df5@f966d

SQLを学習するために意気込む程の気持ちはなくても大丈夫です。
ACCESSなら「クエリデザインでデザインビューとSQLビューを切り替えて確認できる」くらいに思っておけば大丈夫です。
違いは、デザインビューは画面操作で簡単にSQLが作れるけれど複雑SQLは作れない(ユニオンクエリもこれに該当)といった程度です。

インターネット上でやり取りをする場合はテキストベースがほとんどですので、SQLを文字列で扱えるとなれば大きなアドバンテージになります。
(扱えると言うのはコピー&ペーストができるというレベルで大丈夫です)


それではもっと基本的なところからもう少し具体的な手順を

1.選択クエリで出庫明細、入庫明細を作る

元の元になるデータとして
出庫明細

製品ID出庫日出庫数量


入庫明細

製品ID入庫日入庫数量

といったデータが必要になります。選択クエリで問題なく作れますか?
今後のやり取りを楽にするために、それぞれ出来上がったものはQ出庫明細Q入庫明細(クエリは頭文字にQをつける)としておきましょう

2.ユニオンクエリでデータを縦につなげる(前段階)

それぞれ出来上がったQ出庫明細Q入庫明細を使いやすいように手を入れます。
Q出庫明細

製品ID出庫日出庫数量

製品ID入出庫日入出庫数入出庫フラグ
(すべて"出庫")

Q入庫明細

製品ID入庫日入庫数量

製品ID入出庫日入出庫数入出庫フラグ
(すべて"入庫")

クエリビューではユニオンクエリが作れないので作業を簡単にするためにQ出庫明細Q入庫明細を同じ列数、同じ列名に揃えておきます。
さらに、合体させた後に入庫なのか出庫なのかわかるように[入出庫フラグ]フィールドを追加しておきます(このフィールドのデータはすべて「出庫」または「入庫」で固定)

3.ユニオンクエリで入出庫明細をつくる

Q入出庫明細

製品ID入出庫日入出庫数入出庫フラグ
("入庫"または"出庫")

事前準備をしてあるので、最も基本的なユニオンクエリの使い方でつくれます

4.集計クエリで入出庫数を横に並べる

Q入出庫集計_sub

製品ID入出庫日入庫出庫

これも集計クエリとしては基本的な使い方をやることになります。
まだ月ごとの集計になっていないのでQ入出庫集計_subとしておきます。


とりあえずここまで
どこまでできますか?
躓いたら出来上がったところまでのクエリをSQLビューで表示してこの掲示板にコピペしつつ質問しましょう
(SQLビューを開けばSQL文がすべて反転表示されているはずなのでそのまま右クリックからコピーするだけです)

3
フック船長 2019/12/06 (金) 15:54:45 f3309@31d50

ご助言ありがとうございます。

私自身、本を見ながらの組んでいたもので基本的には初心者です。
ユニオンクエリと言われてピンときません。
SQL?とかを学習しないと難しいでしょうか?
SQLやユニオンクエリ、集計クエリをどのように行えばいいのかわかりません。
大変申し訳ありません。

2
yamada 2019/12/06 (金) 15:44:02 df96b@d54d5

早速の返信ありがとうございます。

表示されました。いろいろ勉強になります。
ありがとうございました。

1

名簿管理フォームの設計
顧客名簿や住所録などの閲覧、編集用のフォームを設計するとき、帳票フォームにするか単票フォームするか悩みます。帳票フォームだと一覧性が高いので、複数のレコードから目的のレコードを探すのに便利です。しかし目的のレコードの詳細確認や入力は単票フォームの方が便利でしょう。それの一つの解決策が、2007以降に導入された分割フォームですね。 今回紹介するのは目的のレコードをリストから素早く探せて、単票フォームで...
fc2

上記のページを参考にしたということでしょうか。

デザインビューで、リストボックスに得意先名と担当者名を表示できるようにしたということですね。
フォームのモジュールの下記の部分を修正してください。

Option Compare Database
Option Explicit
Const conSelect = "SELECT 得意先コード, 得意先名, 担当者名 FROM 得意先" 'ここを修正
Const conOrderBy = "フリガナ"
2
hiroton 2019/12/06 (金) 09:38:56 78df5@f966d

どの程度のことができるのかわからないのでヒントだけ

最終的には横並びに月と入庫数や出庫数を見たいのだと思いますが、出庫と入庫が別々なテーブルに分かれているのでちょっと面倒です。
ユニオンクエリ集計クエリあたりをつかって入出庫集計クエリを作ります

「在庫」は「その月までの入庫の合計-出庫の合計」と計算させるのが基本ですが、レポートを使うのであればテキストボックスのプロパティ「集計実行」を使って簡単に実装できます

1
フック船長 2019/12/06 (金) 09:09:58 f3309@31d50

画像1

5
SUSUMU 2019/12/04 (水) 17:39:35 b3fdd@0b6da

ありがとうございます。
試してみます。

4

OS側で120%の設定がされていても、Accessのみ100%表示にできる方法というのはないでしょうか?
たぶんないと思います。

この方法ですと、全てのフォームにこの機能を持たせようと思うと、全てのフォームにこの設定をしなければなりませんか?
そうなりますね。
下記のような関数を作成しておいて、それを一度だけ実行すればOKです。

Public Sub AllFormsSizeCange()
    Dim Frm As Access.AccessObject   
    For Each Frm In Application.CurrentProject.AllForms
        DoCmd.OpenForm Frm.Name, acDesign 'デザインビューで開く
        Call FormSizeChange(Forms(Frm.Name), 0.8) 'サイズ変更
        DoCmd.Close acForm, Frm.Name, acSaveYes '保存して閉じる
    Next Frm    
End Sub

念のためにバッグアップを取ってから実行してください。

3

hatena様

ご返信いただきありがとうございます。

お教えいただいた内容確認させていただきました。
この方法ですと、全てのフォームにこの機能を持たせようと思うと、全てのフォームにこの設定をしなければなりませんか?
OS側で120%の設定がされていても、Accessのみ100%表示にできる方法というのはないでしょうか?

2
ミエ 2019/12/03 (火) 21:42:54 3f0b0@2ff00

確認をさせて頂きましたらしっかり動作致しました。
理解不足でありました為、もう一度一からしっかり勉強させて頂きます。
ありがとうございます。

1

下記の式にしてください。AND は""の内側にいれます。

月毎のカテゴリ: DSum("[数値]","[実験シート]","月次 <= #" & [月次] & "# And カテゴリ = " & [カテゴリ])

DSum の第3引数は、SQLとしての抽出条件式を文字列として設定します。
設定したいSQL条件式は例えば下記のようなものですよね。

[月次] <= #2019/12/31# AND [カテゴリ] = 1

これを文字列にするには、

"[月次] <= #2019/12/31# AND [カテゴリ] = 1"

と"で囲みます。
2019/12/31 と 1 の部分は可変にしたいので、まず分割します。

"[月次] <= #" & "2019/12/31" & "# AND [カテゴリ] = " & "1"

分割した "2019/12/31"と"1"の部分をフィールド参照に書き換えます。

"[月次] <= #" & [月次] & "# AND [カテゴリ] = " & [カテゴリ]

これで完成です。このように順番に少しずつ書き換えていくと理解しやすいでしょう。

質問の条件式

"月次 <= #" & [月次] & "#" And "カテゴリ = " & [カテゴリ] & ""

"文字列" AND "文字列" の形なっており、AND は文字列ではなくなってますので、
AND演算を実行しますが、文字列同士では AND演算 はできないのでエラーになります。

5

前の回答で説明したようにリンク親フィールド、リンク子フィールドの設定で可能なはずです。

現状、
リンク親フィールド txtDate
リンク子フィールド 日付
ということですね。
メインフォームで、氏名コードを表示しているテキストボックス名を txtSimeiCode とすると、
リンク親フィールド txtDate;txtSimeiCode
リンク子フィールド 日付;氏名コード
とすればOKです。
テキストボックス名やフィールド名は実際のものに変更してください。

この説明で分からないのなら、現状のファイルを右カラムの下の方のファイル送信フォームから送信してください。

4
初心者 2019/12/03 (火) 13:24:51 8dddf@3f05e >> 2

hatenaさんのやり方でカレンダーを作成したのですが、今はtxtDateと日付でリンクさせています。
そして、カレンダーの方にも氏名別で予定を表示させたいのですが、今は登録されているすべての予定が表示されてしまっています。

3
初心者 2019/12/03 (火) 13:21:03 8dddf@3f05e >> 1

すみません。説明不足で。
hatenaさんのやり方でカレンダーを作成したのですが、個人でスケジュール管理するために氏名別で表示されるようにしたいです。

2

サブフォームならリンク親フィールド、リンク子フィールドの設定で簡単にリンクできます。
サブフォームのレコードソースは、テーブルか抽出条件を設定してないクエリにします。

複数のフィールドでリンクさせるときは、
例えば、日付 と 氏名コード なら、
日付;氏名コード
というように;で区切って設定します。

1

初心者さん、不明点を知りたいのですが、
カレンダーもサブフォームもフォームに設置したのですか?
予定の入力はできるけれども氏名別にならないという意味ですか?
氏名一覧テーブルと予定テーブルによるクエリーがうまくいかないのですか。どうなればクエリーがうまくいく事になるのですか?

2
hatena 2019/11/27 (水) 17:17:35 修正 >> 1

解決できてよかったですね。

もし、ディスプレイの設定を125%のままで使いたい場合は、下記のリンク先で紹介している関数を使うと簡単にフォームの拡大縮小ができます。これを使って0.8 (1/1.25)で縮小するといいでしょう。

フォーム上のコントロールのサイズを拡大/縮小する関数
モニターの解像度によってフォームと、その全てのコントロールのサイズを指定した倍率で拡大/縮小したい このような質問をたまに見かけます。 単純に全てのコントロールの 左位置, 上位置, 幅, 高さ に指定倍率をかければよさそうに思えます。 当ブログでも同じロジックでレポートを拡大/縮小する関数を下記で紹介しました。 レポートのサイズを拡大縮小する関数 - hatena chips フォームでも同じように出来るので...
fc2

1
SUSUMU 2019/11/27 (水) 16:30:49 b3fdd@8e48d

大変失礼致しました。
マシンのディスプレイの設定でAccessの表示が125%になっていました。
今回はこれにて解決いたしました。
また相談させて頂きます。
失礼しました。

5

ありがとうございました。
再インストールしてみます。

4

新たに作成したファイルもダメです...
試しに、他の関数もしてみたのですが他の関数もダメみたいです。
今思えば、Accessのインストール時に少しエラーが出たのを思い出しました。

だとすると、Officeをアンインストールして、再インストールしてみてください。

64bitか32bitかは関係ないと思います。

3

返信ありがとうございます。

新たに作成したファイルもダメです...
試しに、他の関数もしてみたのですが他の関数もダメみたいです。
今思えば、Accessのインストール時に少しエラーが出たのを思い出しました。
64bit版のほうがいいのでしょうか?

1

そのエラーが出るのは、そのファイルだけですか。それとも他のファイルでもでますか。
また、新規にAccessファイルを作成して、簡単なテーブルを作成してデータを入力して、クエリでDSumを使った場合はどうなりますか。

2
oshiruko2.5kg 2019/11/21 (木) 09:25:59 7ece8@9f543

ありがとうございます。
期待通りの結果になりました。
難しく考えすぎており、行き詰まってしまいました。
もう少し頭を柔らかくして望みたいと思います。

1

レポートの詳細セクションにテキストボックスを配置して、名前を「連番」とします。
下記にように1行追加すればどうでしょうか。

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    
    Me.連番 = i & "/" & Me!発注数
    
    If i < Me!発注数 Then
        Me.NextRecord = False
        i = i + 1
    Else
        i = 1
    End If

End Sub
2

ありがとうございました。
情報提供ありがとうございました。

1

更新プログラムの不具合らしいです。下記のリンクを参照してください。

2019年11月アップデート(KB4484113、KB4484119、KB4484127ʌ - マイクロソフト コミュニティ

更新プログラムをアンインストールするか、MSの修正バージョンがでるのを待つことになるそうです。
詳細は上記のスレッドを読んでください。

5

hatena 様

ありがとうございます。
3通りとも確認し思っていた通りに動作しました。
追加クエリを使用することに致しました。
お手数をお掛け致しました。
勉強になりました。

4
hatena 2019/11/13 (水) 20:57:06 修正

どのように複雑なのでしょうか。
フォーム2のデータをフォーム1にそのまま追加するだけではないのですか。

データを追加するだけなら、追加クエリが一番簡単です。追加クエリをコードで実行して再クエリです。
コード例

Private Sub コマンド8_Click()
    CurrentDb.Execute "追加クエリ"
    Forms![フォーム1].SetFocus
    Forms![フォーム1].Requery
End Sub

追加クエリを作成したくないなら、コードにSQLを直接記述することも可能です。

Private Sub コマンド8_Click()
    CurrentDb.Execute "INSERT INTO テーブル1 SELECT [テーブル2].* FROM テーブル2;"
    Forms![フォーム1].SetFocus
    Forms![フォーム1].Requery
End Sub

一応、追加クエリ(SQL)を使わない別案も出しておきます。

Private Sub コマンド8_Click()
    Dim MeRs As DAO.Recordset
    Set MeRs = Me.Recordset
    If MeRs.RecordCount = 0 Then
        MsgBox "データがありません。"
        Exit Sub
    End If
        
    Forms![フォーム1].SetFocus
    Dim TargetRs As DAO.Recordset
    Set TargetRs = Forms![フォーム1].Recordset

    MeRs.MoveFirst
    Do Until MeRs.EOF
        TargetRs.AddNew
        TargetRs!項目 = MeRs!項目
        TargetRs!金額 = MeRs!金額
        TargetRs.Update
        MeRs.MoveNext
    Loop

End Sub

追加クエリの方がシンプルですし、処理も高速です。

3

hatena 様

ありがとうございます。
追加クエリを使わない方法はないでしょうか?
サンプルは簡素化しておりまして実際は複雑になっており
作り直しができない状態です。
コードではできないのでしょうか?

申し訳ありません。

2

ファイルを見ました。
フォーム1のレコードソースは「クエリ1」です。
フォーム2のレコードソースは「テーブル2」です。

「フォーム2」のデータを一括で「フォーム2」に追加したいということは、
言い換えれば、「テーブル2」のデータを「クエリ1」(テーブル1と同じもの)に追加するということです。
追加クエリという機能がありますので、それを使えば簡単に一括追加できます。

「テーブル2」から「テーブル1」にデータを追加する追加クエリを作成してください。
一括ボタンのクリック時にその追加クエリを実行するコードを記述すればいいでしょう。
追加クエリを実行後に、フォーム1を再クエリするれば、追加データが表示されます。

5
チョコ 2019/11/12 (火) 21:15:33 f6d67@dab18

Accessのオプション

オブジェクトデザイナー

sqlサーバー互換構文
の中のデータベースのチェックを外したら直りました。

フォームフィルタの画面で「*」を入力してライク検索する際に
今までは、likeとなっていたのに勝手にAlikeとなっていたので気がつきました。
「sqlサーバー互換構文」チェックはした記憶はないのですが不思議です。

ちょっと前にWindowsのアップデートが原因でしょうか?
結構壊れる時がありますから…

ご相談させて頂きましてありがとうございました。