Microsoft Access 掲示板

views
4 フォロー
6,278 件中 1,321 から 1,360 までを表示しています。
15
hiroton 2023/10/11 (水) 16:05:45 88156@f966d

では、ついでに
内容が具体的ではなかったのでクエリ側でDMax関数を使う形で回答していましたが、VBA上だけで完結する内容であれば、DMaxの計算は外に出してしまったほうが分かりやすくなると思います

Dim maxValue As Long 'ここの型宣言は適切なモノで


For A1 = 1 To 4

        maxValue = DMax("変位" & A1, "テーブル", "№>=1 AND №<=9")
        StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = " & maxValue _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"

6
Dreamer 2023/10/11 (水) 15:58:29 1b673@46fae >> 5

レポートをダブルクリックで開いた後にもうワンクリックする手間を省きたくて解決法を探しているので、フォーム作ってまで実現したいことではないですね。。考え方は参考になります。
単純に設定で変えられたりできないもんでしょうか。。。

5
hiroton 2023/10/11 (水) 15:34:36 88156@f966d

レポートのなんやかんやってレポートを開こうとしてるときに制御できないみたいですね
しかたないので制御用のフォームを作ってなんやかんやしてみる

開くレポート

Private Sub Report_Load()
    If Nz(OpenArgs) <> "auto" Then DoCmd.OpenForm "制御用のフォーム名", , , , , , Me.Name
End Sub

制御用のフォーム

Private Sub Form_Load()
    DoCmd.Close acReport, OpenArgs
    DoCmd.OpenReport OpenArgs, acViewPreview, , , , "auto"
    Reports(OpenArgs).ZoomControl = 0
    DoCmd.Close acForm, Me.Name
End Sub
14
ぽん 2023/10/11 (水) 15:33:54 2d148@1925b

ご指摘の通り宣言の型が違っておりました。さらっと解決いたしました。ありがとうございます!!

4
Dreamer 2023/10/11 (水) 14:33:43 1b673@46fae >> 2

それだと最大化されます。
自分がやりたいのは、ナビゲーションウィンドウからダブルクリックで開いた時に
レポートがウィンドウ枠の大きさに合わせて全体が表示されるようにすること。
サイズの自動調整ではなく、任意の大きさでウィンドウ枠を保存し、その大きさで開かれるようにしたい。

13
hiroton 2023/10/11 (水) 13:24:57 88156@f966d

以下、サンプルコードを実行してみました

Sub test()
Dim StrSQL As String
Dim A1 As Long
A1 = 1

'ここからコピペ    
StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"
'ここまでコピペ

Debug.Print StrSQL
End Sub

イミディエイトウィンドウには

SELECT A1, 変位1, № FROM テーブル WHERE テーブル.変位1 = DMax('変位1','テーブル','№>=1 AND №<=9') ORDER BY テーブル.変位1 DESC , テーブル.№ DESC;

と表示されエラーは発生しません

問題があるとすればStrSQLの型宣言が間違っているくらいですかね

2
hiroton 2023/10/11 (水) 13:15:06 88156@f966d

質問の内容がよく分からないですが読み込み時イベントでなんやかんやしたらいいんじゃないですかね

Private Sub Report_Load()
    DoCmd.Maximize
End Sub
12
ぽん 2023/10/11 (水) 12:30:47 2d148@1925b

ありがとうございます

StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"

の全文が黄色になってしまいました。

1
Dreamer 2023/10/11 (水) 11:57:52 1b673@46fae

ナビゲーションウィンドウをダブルクリックで開いた時、レポートが毎回左下にずれており、全体を表示するためにレポートを一回クリックしなければなりません。
左下にずれる原因と、対処法をご教示願いたい。

teratailでは「不可能である」と回答されたが、Hatenaさん、どうにかする方法はないでしょうか。
回答をお待ちしております。

1

Access2003はサポートがとっくの昔に切れているので、正常に動作する保証はありません。
新しいAccessを導入して移行することをお勧めします。
職場で使用するということならなおさらです。

11
hiroton 2023/10/10 (火) 18:00:28 af3cc@f966d

パッと見る限りは記述には問題なさそうですね。そのエラーが出たとき、デバッグボタンでエラーの出た行を表示するとどの行がハイライトしていますか?

10
ぽん 2023/10/10 (火) 16:38:43 2d148@1925b

ありがとうございます。直接文字列と A1 で入力したのですが

For A1 = 1 To 4

        StrSQL = _
            " SELECT A" & A1 & ", 変位" & A1 & ", №" & _
            " FROM テーブル" & _
            " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _
            " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"
        Set rs = CurrentDb.OpenRecordset(StrSQL)
        
        rs.MoveLast
        
        aaa = rs.RecordCount
        
        If aaa = 1 Then
        
        Else
        	MsgBox aaa
        End If
    Next

Dmaxの文章を追加したら「エラー13 型が一致しません」になってしまいました。
よろしくお願いいたします

3
nokonoko 2023/10/10 (火) 16:21:06 c4a93@54883

お二方ご回答ありがとうございます。
ご意見を参考にして、組み立ててみます。

9

HGP正楷書体でもHG正楷書体PROと同じく、表示はされるが字体が異なりました。
表示はされるが字体が違うというのは?に置き換わるよりもタチが悪そうなので、
現状のまま、StrConvで?に置き換えて抽出する方法を採ろうと思います。

8

私のところでも字体は違うようでした。
調べてみると「HG正楷書体-PRO」は有料のフォントのようなので、課金しないと使えないのかもしれません。

HG正楷書体-PRO / RICOH(リコー) | フォント専門店 Font Garage

7

こちらにもHG正楷書体-PROがありましたので変更してみたところ、文字は表示されますが字体は違いました。
スクリーンショットを添付したいのですが、どのようにすれば貼り付けられますでしょうか?.pngです

6

すみません、外字が?に変わるのは追加クエリを実行した時ではなく、Strconv([フィールド],4)で半角から全角に変換するクエリを実行した時でした。
例えば「吉(上が士ではなく土)」といったレコード上で太字っぽく表示される文字は、全角変換用のクエリを実行した時に?に置き換わります。

上が土の吉は異体字ですね。Unicodeにはありますので、現在の環境なら通常は正しく表示できます。
Strconv関数はUnicode非対応なので?に文字化けします。

全角変換は、Strconvを使わずに、自作関数を作成してください。例えば、下記などを参考に。

文字化け対応StrConv - Qiita

主にHGP正楷書体をレポート用のフォントとして使用しています。

当方の環境(Win11)では「HGP正楷書体」は入っていないですね。昔、そのようなフォントが入っていた記憶があるので古いフォントなのでしょう。
「HG正楷書体-PRO」というフォントは入っていたので、これで確認してみましたが正常に表示されました。正楷書体なのでおそらく字体は同じだと思われます。

5

主にHGP正楷書体をレポート用のフォントとして使用しています。

4

すみません、外字が?に変わるのは追加クエリを実行した時ではなく、Strconv([フィールド],4)で半角から全角に変換するクエリを実行した時でした。
例えば「吉(上が士ではなく土)」といったレコード上で太字っぽく表示される文字は、全角変換用のクエリを実行した時に?に置き換わります。

2
かずき 2023/10/10 (火) 12:48:28 ddfe5@c1f45

hirotonさんコメントありがとうございます。確かにそうですね、入/出の累計を使ったら繰越処理をわざわざ追加クエリでしなくていけますね。その方が動的に数字がでますね。前月繰越○○個、当月入●●個、当月出△△個、次月繰越(残数)□□個という事にしたかったのです。これも一番最初(前期から残っている分)の入力するだけで不要な処理はせずにだせますね。
ありがとうございました。

3

エクセルもAccessのテーブル、フォーム、レポートも、ユニコードに対応しているので、エクセルで正しく表示されるなら、通常はAccessでも正しく表示されるはずです。

ただし、VBAはいまだにユニコード非対応(Shift-JIS依存)の部分がありますので、使い方によっては非Shift-JIS文字が「?」に変わることがあります。

現行のシステムでは、客先からのExcelデータをインポートし、レポートのレコードソースにする出力用テーブルに追加する際、外字が「?」に置き換わることを利用して、

追加クエリや、通常の代入操作なら「?」に変わることはないはずです。
現状のシステムでは、具体的にどのように「出力用テーブルに追加」しているのですか。

レポートで使用しているフォントでその字がなければ結局Illustratorで修正しなくてはなりません。

今どきのフォントでユニコードでないフォントはないと思いますが、具体的にどのような文字が、修正が必要になりますか。

1
hiroton 2023/10/10 (火) 11:29:46 af3cc@f966d

在庫数は入力を開始してから算出日までの、すべての入庫からすべての出庫を引くと算出できます。この数を求めるだけであれば選択クエリ1つで可能です

2

回答ありがとうございます。
仮にAccessの出力用テーブル上で正しく表示されたとしても、レポートで使用しているフォントでその字がなければ結局Illustratorで修正しなくてはなりません。

2
りんご 2023/10/10 (火) 11:06:57 935bc@0e907

物質テーブル

物質名
あああ
いいい
ううう 
↩︎
法令テーブル
法令名
AAA
BBB
CCC
↩︎
物質別法令テーブル
物質名法令名
あああAAA
あああBBB
いいいAAA
↩︎
> 物質名がその法令に合致していればYesという、YesNo型のデータでよいと考えています。

 合致していれば、組み合わせを登録。登録がない組み合わせは、合致しない。

1
hiroton 2023/10/10 (火) 10:54:41 af3cc@f966d

文字の問題は難しいですね

Excelデータをインポートし、レポートのレコードソースにする出力用テーブルに追加する際、外字が「?」に置き換わる

Excel上で正しく表示されているならACCESSでもそのまま表示されるよう、原因の究明と解決を行うべきだと思います

「『外字は必ずIllustratorで作字を行うこと』というルールがあるので外字は化けてほしい」という要望があるなら今の方法でいいんじゃないでしょうか?意味が分かりませんが

1
hiroton 2023/10/10 (火) 10:46:23 af3cc@f966d

物質名、法令のどちらも増えることが確実

物質名をデータとして、フィールドを法令名にした

フィールド(列)が増える設計はNGです

法令適合テーブル

法令適合ID物質ID法令ID適合
111yes
212yes
321yes
422no

Excelのような表示にしたい場合はクロス集計クエリが使えます

2
みのちゃん 2023/10/08 (日) 17:12:14 ad693@a6874

hatena  さん

ありがとうございます。
テーブル名で解決できました。
お手数お掛けいたしました。

1
hatena 2023/10/08 (日) 10:34:08 修正
CurrentDb.Execute "Update フォーム名 Set フィールド名 = 0;"

CurrentDb.Executeはクエリ(SQL文)を実行するものです。
これはテーブルまたはクエリを対象にするものです。

フォーム名ではなくフォームのレコードソースのテーブル名(またはクエリ名)にしてください。

1
tokinaito 2023/10/07 (土) 15:08:40 cb328@236a9

申し訳ございません。回答はいただいておりました。

9
hiroton 2023/10/06 (金) 17:50:49 19f27@f966d

もう少し前後がないと何ともですが必要そうなところを記述すると

Dim strSQL As String
Dim フィールドカウンタ As Long

For フィールドカウンタ = 1 to 4
  strSQL = "テーブル.A" & フィールドカウンタ & " = DMax('A" & フィールドカウンタ & "','テーブル','№>=1 AND №<=9')"
Next

1~4と、数字部分だけが変わるのであればその前の部分までは直接文字列で記述しておけばいいです

8
hiroton 2023/10/06 (金) 17:41:36 19f27@f966d

難しい問題ですね。使用する言語それぞれについて知識を深め、それぞれ適切に使う。というあいまいな答えになってしまいます

前提として、自分がどのような言語を使っているのか?ということをはっきりさせておく必要があります。その言語というのが「VBA」と「SQL」となりますが、Microsoft Access上において、より厳密には「ACCESS VBA」と「ACCESS SQL」となります
特に、SQLは様々なデータベースで採用されていますが、それぞれのデータベースで少しずつカスタマイズされていて微妙に仕様が変わったりします

これらを踏まえて例えば、Microsoft Accessという環境の上で何かの処理をしたい場合、

ダブルクオーテーションで記述
DMax("変位2","テーブル","ID>=1 AND ID<=9")

という記述は、ACCESSのクエリデザインやフォーム上(テキストボックスのコントロールソース)、VBAなど、どこで記述しても使える記述ですが、

シングルクオーテーションで記述
DMax('変位2','テーブル','ID>=1 AND ID<=9')

は、VBAでは使えません。VBAではシングルクオーテーションはそれ以降をコメントとするという記述になるので、この記述は構文エラーになってしまいます
このような観点からは「SQL構文を直接VBAで操作する」というようなことが無ければ「ダブル」だけ覚えておけば済むともいえます
Accessというアプリケーションとしても、文字列として補完される場合はダブルクオーテーションが使われるのがデフォルトですね

しかしながら、今回の問題のように、VBAでSQL構文を作ることを考えた場合は、シングルクォーテーションを使ったほうが見やすい記述が少ないというメリットが得られます。コードを記述するうえではミスをしにくい記述を心がけるというのが大事になってくるので、「VBAでSQL構文を操作する場合に限って」はシングルクオーテーションを使えるようになったほうがいいと思います。

7
ぽん 2023/10/06 (金) 16:58:37 2d148@1925b

続けてすみません。SQLに使用したいので入力してみたのですがエラーになってしまいました。

テーブル.変数 & A1 = "DMax('" & 変数 & A1 & "','テーブル','№>=1 AND №<=9')"

A1は1から4まで変化していきます。こちらはfor Nextで回しています。
教えていただけますか?

6
ぽん 2023/10/06 (金) 15:52:37 2d148@1925b

つたない説明ですみません。クエリの抽出条件で「ダブルクオーテーション」を使うことは知っていたのですが、囲ってしまうと決め打ちの名前になってしまって思っていた変数として動かなくて...。「ダブルクオーテーション」を3つ使うと、固定した名前と変数と分けることができるのですね、ありがとうございます。ちなみに、これから覚えるとして「シングル」と「ダブル」どちらがおすすめでしょうか?

8
初心者 2023/10/06 (金) 08:27:40 ddfe5@21382

hirotonさん ありがとうございます。なるほどそういう事ですね。その方が加工するのが分かり易い感じですね。ちょっと固定観念にとらわれてました。トライしてみます。アイデアありがとうございました。

5
hiroton 2023/10/05 (木) 15:47:32 be2a0@f966d

全容と、問題としているポイントがわからないのでなんともですが、「SQL文をVBAで作ろうとして躓いている」ですかね?

VBA上では「"(ダブルクオーテーション)」で囲まれた部分は文字列として処理されます。その文字列内で「"」そのものを記述したい場合は、記述したい位置で「"」を2つ続けて記述します

文字列="DMax(""" & 変数 & """,""テーブル"",""№>=1 AND №<=9"")"

"DMax("""
 & 変数 &
""",""テーブル"",""№>=1 AND №<=9"")"

もしくは、SQLでは文字列を指定するのに「"」のほか「'」を使っても良いので

文字列="DMax('" & 変数 & "','テーブル','№>=1 AND №<=9')"

のように書き換えても動作します

4
ぽん 2023/10/05 (木) 15:21:28 2d148@1925b

ありがとうございます。SQLビューをみて簡単なものは、抽出できるようになりました。
次は、クエリの条件を下記のような条件にしたいです。
(テーブル.フィールド)=DMax("フィールド","テーブル","№>=1 AND №<=9")
vbaで処理したいので、フィールドは「変数」にしたいのですが、Dmax関数の中の変数の書き方がわかりませんでした。
お願いいたします

7

hatenaさん ありがとうございます。スクショして頂いた分の最後に記載して頂いてましたね。失礼しました。
こんな機能があったのですね、全然知りませんでした。その名の通り書式が条件により変更出来るとしか思っていませんでした。早速試してみます。本当にありがとうございました。

7
hiroton 2023/10/05 (木) 13:22:42 be2a0@f966d

「生の」とは例えば20日締めなら「締日」のフィールドを用意し「20」と保存しておくなどです
その他、「支払月」として当月=0、翌月=1、翌々月=2・・・、「支払日」として日の数値を保存するようにすればそのまま日付計算に使えるようになります

ただ、数値としてそのまま保存できない条件として、「末締め」「末払い」のような、「該当月の末日」が指定される場合などもあります。このような、結果として日付が変動するような条件については、日にちのデータだけでは表現できないので工夫や、条件分岐せざるを得ないこともあるでしょう

さらに複雑な条件も考えられますが、いずれにせよ、現在の質問のような「締め日ID」「支払日ID」というデータのとり方は無駄に複雑でわかりにくいもににするだけのものです
これを改善するだけでもかなりすっきりしたクエリになりますよ

6

書式の右側のボタンの一番右端のボタンが 有効/無効の切り替えボタンになっていると思います。

下記のリンク先の画像の赤丸で囲まれたボタンです。

Access Tips #348 条件付き書式でテキストボックスが使用可能になってしまうときは? | T'sWare