Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13 / 500 ページ ←次へ | 前へ→

【13067】Re:日付+自動採番
質問  NUTKEY  - 16/9/16(金) 15:12 -

引用なし
パスワード
   亀マスター さん

連絡が遅くなりすいませんでした。

「使用可能」「編集ロック」は実施しました。

日付順に関しては入力日がバラバラなので問題なしです。

また、入力済みの提案日を編集することはないので問題なしです。


Private Sub 提案日_AfterUpdate()
  
Me![提案日] = Format(提案日, "yymm") & Format([連番] + 1, "000")
 
End Sub

と入れたのですがデバックが出てしまいます。

これでは条件がまずいのでしょうか?

そして、連番になってくれません・・・

クエリで入力するとできてはいるのですが、閉じてまた開くと連番ではなくなっています。
これは、亀マスター さんが前回の回答にも書かれたように、
『連番を計算・表示させる前に、更新前の日付を調べ、更新前が空白・同じ月・異なる月などの場合分けで対応する必要があるでしょう。』
に関係があるのでしょうか?


お手数ですが再度教えて下さい。
・ツリー全体表示

【13066】Re:日付+自動採番
回答  亀マスター  - 16/9/12(月) 22:31 -

引用なし
パスワード
   連番の取得までは問題ないと思います。

後はこれをデータに反映させる方法ですが、既に提出月のテキストボックスがフォーム中にあると思いますので(なければテーブルの提出月と連結したテキストボックスを作成してください)、提案日_AfterUpdateのイベントで、取得した連番等をテキストボックスに入力してやればいいのです。

具体的には、
提出月 = Format(提案日, "yymm") & Format(連番 +1 , "000")
としてやればいいでしょう。
※連番 + 1 としているのは、そのままだと連番が000からスタートするためです。連番取得の段階で事前に +1しておけば不要です。


とりあえずはこれで表示されると思いますが、実務を考えるといろいろ問題が出てくるかと思います。

まず、提出月のテキストボックスをそのままにしておくと、ここを直接編集されてしまいます。そこで、提出月のテキストボックスでプロパティ設定を編集し、「使用可能」を「いいえ」に、「編集ロック」を「はい」にしておくことで対応します。

また、入力済みの提案日を編集すると、その時点で提出月が再計算され、番号が狂ってしまいます。これを防ぐには、連番を計算・表示させる前に、更新前の日付を調べ、更新前が空白・同じ月・異なる月などの場合分けで対応する必要があるでしょう。

他に、たとえば8月1日、8月10日、8月5日という順で入力した場合、連番はこの順番になります。それで構わないのならいいのですが、日付順にしたいという場合は上記で述べた方法は使えないので、クエリの編集で少々ややこしいSQLを書く必要が出ると思います。
・ツリー全体表示

【13065】Re:日付+自動採番
質問  NUTKEY  - 16/9/12(月) 9:28 -

引用なし
パスワード
   亀マスター さん

早速の回答ありがとうございます。

クエリ(提案T)を作成し提出月に提出月: Format([提案日],'yyyymm')を作成し年度まで表示させました。

私なりに関数の意味を調べまして、
提案日の更新後処理(Private Sub 提案日_AfterUpdate())に以下を全て入れて操作してみたのですが
提出月に年度までは出てますが、連番が表示されません。
連番は、クエリのフィールドに直接式を入れるのかと思い、入れてやってみたのですが違うようでした。


月初との日付を取得する(年月までを抽出)
FirstDay = DateSerial(Year(提案日), Month(提案日), 1)

月末との日付を取得する(年月までを抽出)
LastDay = DateAdd("d", -1, DateSerial(Year(提案日), Month(提案日) + 1, 1))

[提案日]の値が月初-月末の日付(現在でやると20160901-20160930)のデータの個数を求める。
連番 = DCount("*", "提案T", "提案日 Between #" & FirstDay & "# And #" & LastDay & "#")


今回初めてVBAに挑戦していおり、全く知識がないまま質問して申し訳ありません。
これをきに勉強していこうと思っていますのでご面倒かと思いますが、
再度説明して頂けると助かります。
・ツリー全体表示

【13064】Re:日付+自動採番
回答  亀マスター  - 16/9/11(日) 2:02 -

引用なし
パスワード
   私が思いつくのは、フォーム上で提出日のデータを更新したときに、更新後イベントで提出月に自動入力するという方法でしょうか。


年度はFormat関数で
Format(提案日, "yy/mm")
とすればいいですね。

連番部分については、DCount関数で提出日と同じ月を含む既存のデータ数を数え、これをFormat関数で3桁にするということになると思います。

FirstDay = DateSerial(Year(提案日), Month(提案日), 1)
LastDay = DateAdd("d", -1, DateSerial(Year(提案日), Month(提案日) + 1, 1))
連番 = DCount("*", "提案テーブル", "提案日 Between #" & FirstDay & "# And #" & LastDay & "#")

これで連番を取得し、
Format(連番, "000")
で3桁の連番になりますね。

(Format、DateSerial、DateAdd、DCountなどのの使い方はわからなければ調べてください)
・ツリー全体表示

【13063】日付+自動採番
質問  NUTKEY  - 16/9/8(木) 12:32 -

引用なし
パスワード
   はじめて質問させていただきます。

早速ですが、以下のテーブルデータで、表形式のフォームを作成しています。

テーブル:提案
       ID  :オートナンバー(主キー設定)
       提案日:日付/時刻型
       提出月:短いテキスト

日付が入ったら提出月に年度(yy/mm)+連番(3桁)を表示させたいです。

例)

ID  提案日   提出月
1  20160801   1608001
2  20160831   1608002
3  20160901   1609001
4  20161001   1610001
5  20170101   1701001

初心者の為わかりやすくご教授頂ければ幸いです。
・ツリー全体表示

【13062】Re:空白を<>""で回避出...
お礼  roy  - 16/8/17(水) 7:26 -

引用なし
パスワード
   なるほど!
分かりやすい解説で、私も理解出来ましたm(__)m
ありがとうございます。
・ツリー全体表示

【13061】Re:空白を<>""で回避出...
回答  hatena  - 16/8/17(水) 3:30 -

引用なし
パスワード
   >と記載してますが、=なら空白を検知するのに<>""で空白がスルーされる理由わかる方いらっしゃいませんか?


Null を含む比較や演算の結果は Null になります。

Me.テキストBOXがNullのとき、
Me.テキストBOX <> ""
はNullになります。
IsNull(Me.テキストBOX) はTrueになりますが、
NOT ISNULL(Me.テキストBOX) or Me.テキストBOX <> ""
は、Not True Or Null となり結果はNullです。

If 条件式 Then では、条件式がTrueの時に実行されますので、Nullではスルーされます。

If 条件式 Then
  処理1
Else
  処理2
End If

上記で条件式がNullのときは、処理2が実行されます。


> 皆様はDAOで書き込む際にどの様にされているのでしょうか…

テキストBOXが Null または "" の時に実行したい場合は、私の場合下記のにようにします。


If Nz(Me.テキストBOX,"") = "" Then
  処理
End If


あるいは、

If Me.テキストBOX = "" Then
Else
  処理
End If
・ツリー全体表示

【13060】空白を<>""で回避出来な...
質問  roy  - 16/8/16(火) 23:25 -

引用なし
パスワード
   はじめまして。
accessVBAの質問になります。よろしくお願いします。
rs.EDIT
IF NOT ISNULL(Me.テキストBOX) or Me.テキストBOX <> "" Then rs!テキスト = nz(Me.テキストBOX)
rs.update
をすると空白がスルーされエラーになります。

仕方なしに
IF ISNULL(Me.テキストBOX) or Me.テキスト = "" Then
else
rs!テキスト = Me.テキストBOX
end if
と記載してますが、=なら空白を検知するのに<>""で空白がスルーされる理由わかる方いらっしゃいませんか?
Trimをつかったりnzを使ったりしてますが、解消されません。皆様はDAOで書き込む際にどの様にされているのでしょうか…
・ツリー全体表示

【13059】Re:抽出(AND)がうまくいきません
お礼  ガリクソン  - 16/8/8(月) 16:40 -

引用なし
パスワード
   ▼hatena さん:
ご回答ありがとうございます
教えて頂いた通りにしたらうまくいきました
お礼が遅くなって申し訳ありませんでした
ありがとうございました
・ツリー全体表示

【13058】Re:抽出(AND)がうまくいきません
回答  hatena  - 16/7/29(金) 1:05 -

引用なし
パスワード
   括弧のネストがおかしいようです。
不必要な括弧があるとネストの深さがどうなっているのか見づらいので、
必用最低限の括弧のみにしましょう。
あと改行と字下げを適切に入れるとより見やすいでしょう。

現状の条件は下記のようなネストになっています。

WHERE
(
 ((Year([日付])+(Month([日付])<4))>=Year(Date())+(Month(Date())<4))
  AND ((クエリA.IDコード) Between 1 And 10)
)
OR
(
 ((クエリA.IDコード)=13)
 OR (((クエリA.IDコード)=15))
 OR (((クエリA.IDコード)=25)
)

IDコード 13,15,25 には年度制限がかからず全件表示されてしまいます。


下記のような条件になるようにすべきです。

WHERE
(
 Year([日付])+(Month([日付])<4)>=Year(Date())+(Month(Date())<4)
)
AND
(
 クエリA.IDコード Between 1 And 10
 OR クエリA.IDコード=13
 OR クエリA.IDコード=15
 OR クエリA.IDコード=25
)

このように必用最低限の括弧にして、改行と字下げを適切に入れると
見やすくなり間違いも回避できます。


さらに、いうと、

Year([日付])+(Month([日付])<4)

というようにフィールドを関数の引数にしてしまうとインデックスが
利用できないので件数が多いと重くなります。
フィールドはそのままにして右辺の方をうまく工夫するとインデックスが
利用できて処理が高速になります。
あと In演算子も利用するとシンプルになります。

WHERE
(
 日付 >= DateSerial(Year(Date())+(Month(Date())<4),4,1)
)
AND
(
 クエリA.IDコード Between 1 And 10
 OR クエリA.IDコード In (13,15,25)
)

どうでしょう。
・ツリー全体表示

【13057】抽出(AND)がうまくいきません
質問  ガリクソン  - 16/7/28(木) 10:54 -

引用なし
パスワード
   基本的な事かもしれませんが、抽出が上手くいかないのでご教示お願いします

SELECT Year([日付])+(Month([日付])<4) AS 式1, クエリA.IDコード
FROM クエリA
WHERE (((Year([日付])+(Month([日付])<4))>=Year(Date())+(Month(Date())<4)) AND ((クエリA.IDコード) Between 1 And 10)) OR (((クエリA.IDコード)=13) OR (((クエリA.IDコード)=15)) OR (((クエリA.IDコード)=25))
ORDER BY クエリA.IDコード;

本年度分のIDコード1〜10,13,15,25を抽出したいのですが
なぜか2015年度の1月以降の分まで抽出されてしまいます

年度初めは毎年4月です

どこがおかしいのかご指摘よろしくお願い申し上げます
・ツリー全体表示

【13056】Re:SQLを使って、Dlookupを代用するやり方
回答  亀マスター  - 16/7/27(水) 18:56 -

引用なし
パスワード
   ▼morimu さん:

>下のようにDlookupを使って実現できるのですが、テーブルAのレコード件数が多くて
>実用的に遅くて使えないです。

DLookupは基本的に遅い関数ですので、レコード1件ごとに3回も呼び出していれば遅くなるでしょう。また、IIfもレコード数が多いと速度低下につながります。

DLookupをSQLで同等のものを実現する方法ですが、以下のようにやります。

DLookup("フィールド名","テーブル名", "条件式")の代替として、
(SELECT フィールド名 FROM テーブル名 WHERE 条件式)

レコード数やその他条件にもよりますが、DLookupよりは速度的に改善されると思われます。
・ツリー全体表示

【13055】SQLを使って、Dlookupを代用するやり方
質問  morimu  - 16/7/25(月) 13:53 -

引用なし
パスワード
   テーブル A

A1 A2 A3 A4
X11 X11-1 X11-2 X11-3
X21 X21-1 X21-2 X21-3
X31 X31-1 X31-2 X31-3
X41 X41-1 X41-2 X41-3
X51 X51-1 X51-2 X51-3


テーブル B
B1 B2 
X11-1 1 
X21-1 2 
X21-2 3 
X31-1 4 
X31-2 10 
X31-3 11 
X41-2 12 
X41-3 13 
X51-1 14


テーブル A とテーブル B 2種類あります。
テーブル Aは4カラムですべて文字列
テーブル Bは2カラムですべて文字列


クエリCはこのような結果を得たいです。

クエリC
 
A1 A2 A3 A4                A5  A6  A7
X11 X11-1 X11-2 X11-3  1   0   0
X21 X21-1 X21-2 X21-3  2   3   0
X31 X31-1 X31-2 X31-3  4  10   11
X41 X41-1 X41-2 X41-3  0  12   13
X51 X51-1 X51-2 X51-3  14   0   0

1. クエリCとテーブルAのレコード件数は同じ
2. テーブルA の A2,A3,A4の値とテーブルBの B1とでVlookupして、B2の値をとります。ただし同じ行に値をとります。
  A2で取ったB2の値はA5、A3で取ったB2の値はA6、A4で取ったB2の値はA7のカラムにとります。

下のようにDlookupを使って実現できるのですが、テーブルAのレコード件数が多くて
実用的に遅くて使えないです。

フィールドに
A5:IIF(Dlookup("B2","B", "[B1] ='" &[A2]& "'")="",'0',Dlookup("B2","B", "[B1] ='" &[A2]& "'"))
A6:IIF(Dlookup("B2","B", "[B1] ='" &[A3]& "'")="",'0',Dlookup("B2","B", "[B1] ='" &[A2]& "'"))
A7:IIF(Dlookup("B2","B", "[B1] ='" &[A4]& "'")="",'0',Dlookup("B2","B", "[B1] ='" &[A2]& "'"))
と記載すれば、目的の値はとれることはわかる。

SQLを使って表現するには、どのようにすればよいかご教示いただけないでしょうか。
何卒よろしくお願い申し上げます。
・ツリー全体表示

【13054】Re:Dlookupの書き方について
お礼  morimu  - 16/7/23(土) 16:52 -

引用なし
パスワード
   亀マスターさん ありがとうございます。
基本的な LEFT, RIGHT, INNER JOINは理解しています。

DLOOKUPで 表現するためにどのようにしたらいいかを質問しました

"'" と & を使って、Dlookupで記載できることがわかりました。

今回の問い合わせクローズします
・ツリー全体表示

【13053】Re:Dlookupの書き方について
回答  亀マスター  - 16/7/19(火) 19:39 -

引用なし
パスワード
   ▼morimu さん:

>B1, B2, B3, B4:Dlookup("A4","A","[A1]=[B1]")

通常、このような作業をする時はDLookupを使うのではなく、クエリの機能を使うものです。クエリのデザインビューでテーブルAのフィールドA1をドラッグアンドドロップでテーブルBのB1に移動させるように操作します。

どうしてもDLookupを使いたいのなら、おっしゃるとおり書き方に問題があるので、修正が必要です。
"[A1]=[B1]"
では、テーブルAの中でA1フィールドとB1フィールドが同じ値のものを抽出することになりますが、テーブルAの中にB1フィールドが存在しないのでエラーになるのです。もしあったとしても、条件を満たす何らかの値が1種類だけ表示されることになり、目的は達成できませんが。
正しくは、
"[A1]=" & [B1]
としてやることです。ここでの[B1]はテーブルBにおけるB1フィールドのそれぞれの値を示しているので、テーブルB1のそれぞれの行に対して[B1]の値を取得して、それとテーブルAのA1フィールドの値が一致するものをDLookupで得ることが出来ます。

細かい使い方を知りたいなら、Accessの入門サイトなどでSQLのWHERE句の使い方を勉強してみてください。DLookupの第3引数は、WHERE句そのものなので。
・ツリー全体表示

【13052】Dlookupの書き方について
質問  morimu  - 16/7/18(月) 19:40 -

引用なし
パスワード
   テーブル A

A1 A2 A3 A4
X11 X12 X13 X14
X21 X22 X23 X24
X31 X32 X33 X34


テーブル B
B1 B2 B3 
X11 Y12 Z13
X21 Y22 Z23
X31 Y32 Z33

テーブル A とテーブル B 2種類あります。
テーブル Aは4カラムですべて文字列
テーブル Bは3カラムですべて文字列

があります

新しいクエリを作り、Dlookupからテーブル A のA4の値を
取りたいです。


B1 B2 B3  B4
X11 Y12 Z13 X14
X21 Y22 Z23 X24
X31 Y32 Z33 X34
を作成したいです。

新しいクエリに
B1, B2, B3, B4:Dlookup("A4","A","[A1]=[B1]")
と書いたのですが、
Dlookupのcriteria の条件の構文がうまくかけず、
エラーになります。
正しい Dlookupの書き方をご教示いただけないでしょうか
(エクセルのvlookupだと容易なのですが、accessはうまく書けません。)


B4:Dlookup("A4","A","[A1]='X11'")
と書くと、'X14' しか取れません。B1のフィールド値を条件に組み込みたいです

宜しくお願い申し上げます
・ツリー全体表示

【13051】レポート画面のボタンでPDFファイルを開く
質問  kouzi E-MAIL  - 16/7/18(月) 15:15 -

引用なし
パスワード
   レポート画面にボタンを作り、マクロで別のフォルダのPDFファイルを開きたい。
今は、添付ファイルのテーブルを作ってやっています。
宜しくお願いします。
・ツリー全体表示

【13050】2つのテーブルの結合方法を教えて下さい
発言  初心者  - 16/6/29(水) 15:58 -

引用なし
パスワード
   こんちには。アクセスを始めたばかりで分からない事があり、質問させて頂きます。
2つのテーブルの結合について教えて下さい。
・テーブルA
氏名、年齢、住所、アドレス

・テーブルB
住所、電話番号

<求めるテーブル>
氏名、年齢、住所、アドレス、電話番号
上記の様にしたく考えております。

この場合に、共通の住所に電話番号を追加したいのですが、どのようにすれば宜しいでしょうか。

また、テーブルBは後からエクセル形式で来たので、一発で追加する方法がありましたら教えていただけると助かります。

よろしくお願い致します。
・ツリー全体表示

【13049】Re:vba関数がわからない
発言  亀マスター  - 16/6/21(火) 22:03 -

引用なし
パスワード
   わざわざAccessでやる必要性をあまり感じませんが…。
Accessはデータベースソフトなので、データ入力や取り出しにそれなりの知識が要ります。単純に計算させたいだけなら、Excelの方が使い勝手がいいと思うのですが。それに、おっしゃる程度の作業であれば、VBAを使わずともExcelの関数で実現できますよ。

どうしてもAccessのVBAでやりたいということであれば、あなたが現状でどこまでできるのかがわからないとアドバイスのしようがないので、それを示してください。
ただ、AccessにせよExcelにせよ、VBAをほぼ扱ったことがないという状態のように思えました。
もしそうなら、掲示板でやり方を質問するよりも、入門サイトや書籍で最低限のスキル(変数の使い方、ループ処理の記述、条件分岐など)を身につけてからにすることをお勧めします。そうでないと、具体的なコードを示されても意味がわからないでしょうし。
・ツリー全体表示

【13048】vba関数がわからない
質問  初めてのAccess2007  - 16/6/21(火) 13:32 -

引用なし
パスワード
   物の大きさの比率を表にしようと色々やんているのですが、おそらくVBAかマクロを
使うのだろうと思いますが、どの関数をどう使えばよいかわかりません

例:リンゴの絵を拡大版か縮小版書くとします
  縦15cm横10cmのリンゴを基準とし実寸したリンゴの大きさのパーセンテージを表で
  表し、縦横それぞれ何cmになるか“コマンドボタン”を使いそれぞれ自動で計算
  する物を作りたいです。
  
(テーブル)
  フィールド:ID(オートナンバ型)
      実寸(テキスト型)
      比率(テキスト型)
      縦(テキスト型)
      横(テキスト型)

作業内容:リンゴの縦か横どちらかの長さ測り
     縦の長さを測った時は縦の“コマンドボタン”を押し
     横の長さを測った時は横の“コマンドボタン”を押す事でそれぞれに結果が
     反映されるものです

例:リンゴの縦の長さを測り(例:12cm)実寸の欄に“12”と入力し
  縦の“コマンドボタン”を押すと自動で
  実寸=12cm  
  比率=80% 
  縦 =12cm
  横 =8cm
  と結果がでる方法を教えてください
Accessは初めてなので、かなり砕いた感じで教えてください
よろしくお願いします


  
・ツリー全体表示

13 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078194
(SS)C-BOARD v3.8 is Free