Dim infoPath As String
'infoPath変数に代入するのであれば先に判定した方が良いと思います。
'コントロールの値が、空白("")またはNULL値かによって条件処理
if len(nz(trim(Me!txt客パス)))<>0 then
infoPath = trim(Me!txt客パス)
else
MsgBox "客パスが入力されていません。",vbOKOnly + vbExclamation
exit sub
end if
'txt情報は、コントロール名かな?
'上記と同じように空白("")またはNULL値かによって条件処理
if len(nz(trim(Me!txt情報)))<>0 then
'AcDirは自作の関数でしょうか? そのままカキカキ..
If AcDir(infoPath, vbDirectory) <> "" Then
Shell "Explorer.exe " & Me!txt客パス, vbNormalFocus
else
MsgBox "保存しているパスが存在しません。パスを確認してください。",vbOKOnly + vbExclamation
exit sub
end if
else
MsgBox "先に情報を入力してください。",vbOKOnly + vbExclamation
exit sub
end if
SELECT 学生テーブル.学生番号, 学生テーブル.氏名, Nz(Sum(IIf([修得年度]="2019",1)),0) AS 取得済成績
FROM 学生テーブル LEFT JOIN 成績テーブル ON 学生テーブル.学生番号 = 成績テーブル.学生番号
GROUP BY 学生テーブル.学生番号, 学生テーブル.氏名;
Private Sub 詳細_Paint()
If Nz(Trim(txt_ColorCode), vbNullString) <> vbNullString Then
Me.Lbl_info.BackStyle = 1
Me.Lbl_info.BackColor = txt_ColorCode
Else
Me.Lbl_info.BackStyle = 0
End If
End Sub
SSELECT
T_生産.商品ID,
Format([生産日],"yyyy\年mm\月") AS 年月,
Sum(T_生産.生産量) AS 生産量計
FROM T_生産
GROUP BY T_生産.商品ID, Format([生産日],"yyyy\年mm\月");
このクエリで、商品別年月別の生産量の合計が出力できます。
上記の2つのクエリから下記のようなクロス集計クエリを作成します。 CQ_商品年月別
TRANSFORM Nz(First([生産量計]),0) AS 値
SELECT Q_商品_年月.商品ID
FROM
Q_商品_年月 LEFT JOIN Q_商品年月別計
ON (Q_商品_年月.年月 = Q_商品年月別計.年月) AND (Q_商品_年月.商品ID = Q_商品年月別計.商品ID)
GROUP BY Q_商品_年月.商品ID
PIVOT Q_商品_年月.年月;
hiroton様
早速ご返答いただき誠にありがとうございます。
cmb年度_AfterUpdate()
を入れたところ、うまく動きました。
すでに入力済のデータで年度をいじることはほぼないと思いますので、
大丈夫かと思います。
本当にありがとうございます。
ついでに、
新規・修正が同じフォームということなので、このコードだけだと、修正モードの時でも[cmb年度]を修正すると連番が変わります(処理が働きます)
年度(データ)は修正するけど一度取得した番号は変えたくないとかだと仕様に合わせてもうひと手間必要になりますね
思われている通りであっています
テキストボックスの使いまわしをするのであればコントロールソースは非連結にしてVBAで処理することにしましょう。タイミングは
ということなので[cmb年度]の更新後処理で
hiroton様
ご回答いただき誠にありがとうございます。
2つのコントロールソースに、頂いた式を挿入し、
新規登録時(サンプルコードの1,2の処理)の際は、
やりたいことが実現できました。
しかし、1点問題が出てきてしまい、
申し訳ございませんが、
再度質問させて頂きたいと思います。
もともと2018.2019等過去データには値が入っており、
別途用意してある検索フォームから
「詳細/修正」ボタンを押すと
今回のフォームが開き、
検索フォームで選択された「ID」に連動した値が、
該当の登録フォームの、各レコードの値が挿入される仕様になっています。
(サンプルコードの「4.検索フォームから選択したデータの値取り込み」の部分。)
新規登録モードと修正モードが同じフォームで出来るような形になっています。
今回の修正後、
検索フォームで「詳細/修正」ボタンを押すと、
実行時エラー '2448'
このオブジェクトに値を代入することはできません。
の部分がデバックで表示され、該当フォームを開くことができなくなってしまいました。
もともとは、「詳細/修正」モードの場合、
非連結のテキストボックスで、
IDに連動したレコードを表示させていただので、
コントロールソースにあらたな数値を設定してしまったので、
エラーがでてしまったのでしょうか?
VBAでの処理が必要なのかどうか、
「新規登録」とは別に「詳細修正フォーム」を新たに作ったほうが良いのか、
質問ばかりで申し訳ありませんが、よろしくおねがいします。
軽く見た感じVBAでどうこうしたいということではないのかな
DMax関数は第三引数に条件を指定できます
Tx年度別連番のコントロールソース
Tx管理番号のコントロールソース
saku様、早速ご教示いただいてありがとうございます。
姓:"No." & [顧客ID] & " " & Left([氏名],Instr([氏名]," ")-1) のコード問題ないのですね。
姓:"No." & [顧客ID]と、姓:"No." & cstr([顧客ID])ができるかどうか、すぐに試したいところなのですが、職場でしかできないため、明日、早速試してみたいと思います。
私の環境(Access2019)では、姓:"No." & [顧客ID] & " " & Left([氏名],Instr([氏名]," ")-1) のコード問題なく表示されました。環境が違うからかなぁ・・
顧客IDはオートナンバーと思いますが、まずは、姓:"No." & [顧客ID]で連結できるか試してみては?
姓:"No." & cstr([顧客ID]) として連結してみても出来ませんか?
コード記述はそれぞれあると思いますが以下のようにしてみてはどうでしょうか?
ポイントは、空白(""=vbnullstring)または、NULL値どちらでも入力文字数が0(ゼロ)であれば未入力としています。
参考になれば幸いです。
Me!txt客パス の値がNullになっていませんか?
String型にNullは代入できないようになっています。
Variant型にするか、
代入時に If (IsNull(n) = False) Then 等でNullを代入しないようにしたらどうでしょうか…。
それ以降のif節内については素人なのでわかりかねますが……申し訳ないです。
出ませんでした。
ありがとうございました。
これで、業務を早くすることができます。
パスワードがかかっていても普通にインポートはできます。
一度、手動でインポートしてみてください。パスワード無しにインポートできると思います。
下記のコードのみで実行してもエラーが出ますか。
strDocName = "C:\Users\Desktop\aaaa.xlsx"です。
失礼しました。
エラーの箇所は、
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "MTtest",
"C:\Users\Desktop\aaaa.xlsx", True, "Sheet1!W4:AF200"
です。
元ファイルのExcelにはPWがかかってまして、
With oApp
.Visible = True
.Workbooks.Open FileName:=strDocName, _
Password:="abcd"
.ActiveWorkbook.Close False
.Quit
End With
Set oApp = Nothing
これが必要かなと思いまいした。
お手数かとおもいますが、よろしくお願いします。
どのコードがエラーが出てますか。
strDocName = "C:\Users\Desktop\aaaa"
これは拡張子がないですが、実際のものかちゃんと拡張子ついてますか。
あと、エクセルブックをインポートするだけなら、
「Excelファイルオープン」のコードは不要です。
hatenaさん、申し訳ありませんでした。リンクテーブルを削除してから再リンクの方法をテーブルのインポートで行ったらパスワード入力画面が出て、入力後うまくいったようです。なにせ、アクセスを使いだして20年以上になりますが、当方70歳でいろいろ苦慮しています。アドヴァイス有難うございました。
hatenaさん、有難うございました。リンクテーブルを削除してから再リンクしましたが、、「パスワードが間違っています」と表示されて、パスワードの入力画面が出ないのでテーブルリンクができませんでした。
リンクマネージャーを使わずに、リンクテーブルを削除してからリンクしなおしたらどうなりますか。
hiroton様
失礼しました、学生マスタとは学生テーブルの打ち間違いです*本文を修正いたしました。
SQLについて確認いたしました、想定していた挙動どおりです。
迅速にご教示いただき誠にありがとうございました。
学生マスタとは何者でしょう?
学生の情報が抜け落ちてしまっているクエリ1をつかって計算させるのはめんどくさいです。専用にクエリを作り直してしまったほうがいいでしょう
これは、ACCESSのデザインビューで作成したクエリをそのままSQLビューで表示したものです。SQLビューに張り付けてデザインビューに切り替えれば「クエリのデザインビュー例」が確認できます
修正版
RGB並び順を修正
HTMLのカラーコード指定は6桁(3桁でもいいけど)必要なので10進数→16進数変換で特定の場合に上位桁がなくなってしまうのを修正
divタグは不要っぽかったので削除
RGBは確かに逆順にしないとダメでした。いい感じの技術資料が見つけられなかったんですが、実装次第で異なる場合もあるようですRGBのHex並びが逆(AddinBox/VBAユーザーの為のOpenOffice.org 備忘録さん)
これはもう、VBAではそう、としか言いようがなさそうです
カラーコード表記は例えば「#FF0000」で、最初の#を除いて先頭2文字が1つ目のグループで「R」の量を表す、3~4文字目が・・・
となっていて、「桁」自体は存在しません。これを数値にする場合、「桁」を与える必要があります
数値で同様のことを考えると、1つ目のグループは一の位で2つ目のグループは十の位で・・・と考えることができます。そして、これを文字であらわすときは一番大きいグループから表記します。
一の位が3
十の位が2
百の位が1
ならば3×1+2×10+1×100 → 123
これをRGBに当てはめ、
1つ目のグループ(R)がFF
2つ目のグループ(G)が00
3つ目のグループ(B)が00
ならば、FF×1+00×256+00×256×256 → &H0000FF
このように考えると
カラーコード表示のRGB(255,0,0)→#FF0000
16進数表示のRGB(255,0,0)→&H0000FF
のように、文字の並び順だけ見れば逆になるという表現方法も間違いとは言えないことがわかると思います
hiroton様の投稿内容でも試してみましたが、うまく動作しませんでした。
HTMLでのカラーコードはRGBの順ですが、VBAでの10進数のカラーコードをhex関数で16進数に変換すると、
何となくですがBGRの順で出てきます。
VBAは内部的に色をBGRの順で計算しているのでしょうか。
考えていると頭が混乱してきました。
参考画像を貼っておきます。アドバイスを頂いたお二方、本当にありがとうございました。
年末年始の繁忙期のため、お礼が遅くなり申し訳ございません。
以前投稿されていた、詳細_paintイベントを使う方法でうまいこと動いてくれました。
お教え頂いた方に感謝申し上げます。
カラーコードのテキストボックスを txt_ColorCode、
色を表示したいラベルを Lbl_info とします。
Private Sub 詳細_Paint()
If Nz(Trim(txt_ColorCode), vbNullString) <> vbNullString Then
Me.Lbl_info.BackStyle = 1
Me.Lbl_info.BackColor = txt_ColorCode
Else
Me.Lbl_info.BackStyle = 0
End If
End Sub
これで色を表示させることが出来ました。ありがとうございました。
集計結果を表示出来ない原因が参照先のクエリが開けなくなっていだ事が原因だと分かりました。社内SEが式に合わせる為、フィールド名を変更していた様で何処かでバグが起きて開けなくなっていました。開けるクエリと置き換え式のフィールド名を変えた所表示できました。今までと違い違うパソコンからそのクエリを開こうとするとodbc接続に失敗しましたというエラーがでたり色々分からない事が多いですが取り敢えず集計ボックス表示はできたので助かりますました。有難う御座いました。
ありがとうございました。
ご回答をもとに組み立てることができました。
MT_年月を前もって作成しておくのは、長期運用しにくいので、
自力で解決策を考えてみます。
(困ったら、また質問させていただきます
Accessの問題ではなかったんですね。権限の問題で、表示スケールがいじれないのですが、Accessのせいではないということがわかって助かりました。ありがとうございます。
これに対応するには、出力したいすべての年月を格納するテーブルが必要になりますね。
下記のようなテーブルを作成してください。
テーブル名 MT_年月
年月
2020年01月
2020年02月
2020年03月
2020年04月
一つのクエリでは難しいので、複数のクエリを組み合わせて目的に出力になるようにしていきます。
Q_商品_年月
このクエリですべての商品IDと年月の組み合わせが出力できます。
Q_商品年月別計
このクエリで、商品別年月別の生産量の合計が出力できます。
上記の2つのクエリから下記のようなクロス集計クエリを作成します。
CQ_商品年月別
これでご希望の結果になると思います。
OSのディスプレイの表示スケールの設定を標準から変更してないでしょうか。
もし、しているなら 100% に戻したらどうなりますか。
Windows 10でディスプレイの表示スケールの設定を変更して見やすくする:Tech TIPS - @IT
なるほど…簡単なことが思いつかずお手数をおかけしてしまいました。申し訳ありません。
ご回答ありがとうございました!
更新クエリの抽出条件で企業テーブルにデータが存在していないものを除外するようにすればいいのでは。
これで分からなければ、現状の更新クエリのSQLと各テーブルの主キーフィールドを提示してください。
締日は普通、情報は日付のみでは?
支払条件には月の区切りとする日(締日)と、支払いに関する日付(担当者が入金処理をする日)の2つの日付の情報が含まれるものです(支払いの方法(現金、手形等)も記述されるものですが今回は省略)
例外としては
前払い(初回取引のためだったり)
請求後30日(「締日」を定めない。日本の企業ではまずない)
なんかもありますね
さておき、「1か月後末日」では何を計算したいのかわかりません。「締日」の月が変わるのは「請求日」と「締日」の関係からであって、「1か月」という情報は関係ありません。記述の仕方からすると「締日」に関する情報が不足のようにみえます
支払日を求めたいのであっても、上記のように「締日」の条件で月が変わるため情報不足です
いずれにせよhatenaさん指摘のようにデータベース上では計算しやすい数値としてフィールドに分けて保存するのが基本で、
締日日(末締めは0)
支払月間
支払日日(末日は0)
の3つのフィールドを持つといいでしょう
Trueの扱いについて
hatenaさんの式の
-([締日日]=0)
は面白いなぁと思います。hirotonの式では+IIf([支払日日]=0,1,0)
と記述しました。どちらも同じ結果になるのでどちらでもいいです。ただし、ACCESSならこんぴゅうたぁのはなし になるのですが、ACCESSで適当なフォームを作り、テキストボックスを配置してコントロールソースを
=Date()+True
とします。つぎに、Excelを立ち上げて適当なセルに=TODAY()+TRUE
としてみます。結果はご覧あれテクニックとしてどこまで許容するかという話になるんですが、真偽値をそのまま計算に使うのは上記のようにそれなりの知識が必要になるのでオススメしません
大変参考になりました!ありがとうございます。
>蛇足ですが、こういう並び順はユーザーフレンドリーでないので
おっしゃる通りで、並び順自体スッキリしないなと、ずっと感じています。。
どなたか並び順のアイデアがあれば、ご教示いただけると非常に助かります。
優先順のグループ分けを3通りにする
IIfのネストは見づらくなるのでSwitch 関数でもいいですね
蛇足ですが、こういう並び順はユーザーフレンドリーでないので、フォーム上に並び順に関する注釈が欲しくなります
なるほど…!イメージがわきました。
作ってみて、またわからなければ質問させていただきます。
ありがとうございました!
リンクテーブルでリンクできているなら、接続エラーにならずにインポートできると思います。
インポートがだめなら、リンクテーブルから追加クエリでローカルテーブルにデータ追加すればいいでしょう。
daoで接続できるなら、エクスポート先はExcelでもAccessでも同じことでは?
テーブルは、恐らくオラクルとのリンクテーブルになっており多くの端末で共有していると思います。ですので一個人の為にテーブルデザインを変える事は出来ません。私は、会社のシステムを扱う部署にいない為詳しく分かりませんが、オラクルサーバーのテーブルそのものを全く違うテーブルに変更しています。タスクマネージャーでは、何か分からない大量のタスクが夕方から昼にかけて起動しています。office 2000 からoffice2016に代わり負荷が掛かってレスポンス低下を招いている事も一因です。インポートもテーブルをインポートする際、接続エラーがでて一部のテーブルしかインポート出来ません。今は、私の作ったマクロが動かない為、事務の方がexcelにクエリをコピペしてsumで集計しています。この状況を打開する為、確実に動きそうなexcelにdaoでエクスポートを思い付きました。
もっと簡単な方法が有れば良いのですが。
リンクを貼るのを忘れてました。前回の回答にリンクを追記しておきましたのでご参照ください。
ただし、この方法はテーブルに集計値格納用のフィールドを追加する方法ですので、共有しているファイルでテーブルデザインの編集ができる必要があります。
いままで、普通に使えていたのが、「会社のシステム変更」により著しく遅くなったとしたら、どのような変更をしたのか、それがどのように影響しているのか、の確認がまずは必要でしょう。
ネットワーク上で共有しています。プロパティにオンラインとなっていた為、オンラインなのかと思っていました。フォームのボタンに集計結果をダイアログボックスに表示するコードを入れてありこのコードを再利用したいと思っています。となると後者の方法でしょうか?また、更新クエリを使う場合の方法のリンク先を貼って下さると助かります。宜しくお願い致します。
締日定義を「1か月後末日」とすると、条件分岐が面倒です。(できないことはないですが)
下記のようにすれば、簡単に締め日を式で計算できます。
「会社情報テーブル」に下記のフィールドを持たせます。
締日日 数値型
締日月後 数値型
例えば、締め日が「1か月後20日」なら、
締日日: 20
締日月後: 1
と入力します。
「1か月後末日」なら、
締日日: 0
締日月後: 1
とします。
末日の場合は、締日日を0とします。
請求リストフォームのレコードソースのテーブルからクエリを作成して、フィールド欄に下記の式を設定すれば締日か表示されます。
このクエリをフォームのレコードソースにして、締め日のテキストボックスのコントロールソースを「締日」とすれば請求日を入力すれば締日が表示されます。
オンラインとは具体的にどのようなことでしょうか。
イントラネット上にあるということでしょうか。
DSum, DCount は重たい処理ですので(特にネットワーク上で共有している場合)、別の方法を検討された方がいいでしょう。
例えば、下記のリンク先の方法で更新クエリで集計値をテーブルに格納しておくとか。
更新クエリで定義域集計関数を使わずに集計する - hatena chips
あるいは、必要なデータをローカルにテーブルとしてインポートして利用するとか。(わざわざエクセルにする必要はないでしょう。メリットは何もありません。)
たぶん、テーブル設計が間違っていると思います。データベースでは同じデータを複数個所に格納するということはしません。
関連性のあるデータは関連付けて簡単に引っ張ってくることができますので。
とりあえず、テーブルAとテーブルBの主なフィールド名、主キー設定を提示してもらえますか。