'前略
ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
myArray = adoRs.GetRows '全レコードを配列として取得
x = 0
Dim nbDic As Object
Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
For i = 0 To RcCnt - 1
If nbDic.exists(myArray(0, i)) = False Then '空のDictionary内にデータがあるか確認
'空なので存在するはずがない、常にFalse
x = x + 1
End If
Next
MsgBox x
件数を取得するなら下記のようなコードになると思います。
'前略
ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
myArray = adoRs.GetRows '全レコードを配列として取得
Dim nbDic As Object
Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
For i = 0 To RcCnt - 1
nbDic(myArray(0, i)) = myArray(0, i) 'データ配列の1列目をDictionaryに格納
’重複データは上書きされる
Next
MsgBox nbDic.Count ’件数を表示
Sub test1()
With ThisWorkbook.Worksheets("申請書")
Dim l As Single, t As Single, w As Single, h As Single
With .Range("aK23:aL23")
l = .Left
t = .Top
w = .Width
h = .Height
End With
With .Shapes.AddShape(msoShapeOval, l + w / 2 - h / 2, t, h, h)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlack
End With
End With
End Sub
ちなみに、
ここは Microsoft Access に関する質問をする掲示板です。次回からは適切な掲示板で質問してください。
Private Sub 参加カテゴリ_Exit(Cancel As Integer)
If Nz(Me.参加カテゴリ.Value) = "" Then
Cancel = True 'フォーカス移動をキャンセル
MsgBox "参加種目が選択されていません", vbOKOnly
End If
End Sub
A better date picker that works in both 32-bit & 64-bit Access and uses no ActiveX controls. The latest version automatically adjusts the form size depending on screen resolution and optionally translates the form captions to match the Office language. It also includes a week number feature
Private Sub 日付カレンダー_Change()
On Error Resume Next
Me!次のコントロール.SetFocus
If Err <> 0 Then
DoCmd.RunCommand acCmdShowDatePicker
End If
On Error GoTo 0
End Sub
Private Sub 日付_Enter()
Me!日付カレンダー.SetFocus
End Sub
Private Sub 日付カレンダー_AfterUpdate()
Me!日付 = Me!日付カレンダー
End Sub
Private Sub 日付カレンダー_Change()
'//カレンダーの日付をクリックしたときに発生するイベント
'//ここで、別なコントロールに移動してAfterUpdateを発生させる
Me!次のコントロール.SetFocus
End Sub
Private Sub 日付カレンダー_Enter()
Me!日付.TabStop = False
If IsDate(Me!日付) Then
Me!日付カレンダー = Me!日付
Else
If IsDate(Me!対象年 & "/" & Me!対象月 & "/1") Then
Me!日付カレンダー = Me!対象年 & "/" & Me!対象月 & "/1"
Else
Me!日付カレンダー = Null
End If
End If
DoCmd.RunCommand acCmdShowDatePicker
End Sub
Private Sub 日付カレンダー_LostFocus()
Me!日付.TabStop = True
End Sub
Private Sub Form_Load()
Me!営業日数 = 営業日数取得
End Sub
Function 営業日数取得()
営業日数取得 = Day(Date) - DateDiff("ww", Date - Day(Date), Date, vbMonday) - DCount("*", "T_臨時休業日", "日付 Between #" & Date - Day(Date) + 1 & "# And #" & Date & "#")
End Function
上記の投稿は私の投稿です。出先でログインせずに投稿してしまいました。
「重複のないデータを取得する」とのことですが、件数を取得するということでいいのでしょうか。
提示のコードは常に全データ件数になり、重複も含む件数になると思いますが。
件数を取得するなら下記のようなコードになると思います。
重複をチェックするフィールドに インデックス(重複あり) を設定してありますか。
もし設定してないなら、設定すると飛躍的に速度は改善すると思います。
原因が分かりました
.Existsでした
sが抜けてました
ありがとうございました。
非常に分かりやすいコードです。
ざっとみたところ下記の箇所があきらかな間違いですので、修正してみてください。
これでとりあえずはエラーなく動くと思います。
もし自分が書くなら下記のような感じになります。
ちなみに、
ここは Microsoft Access に関する質問をする掲示板です。次回からは適切な掲示板で質問してください。
例えば、
エクセル質問掲示板 質問 疑問 使い方 掲示板 エクセル Excel [エクセルの学校]
Excel VBA を学ぶなら moug モーグ|Excel (VBA)
ありがとうございます
こちらの記述で思う通りにできました
Private Sub 参加カテゴリ_Exit(Cancel As Integer)
If Nz(Me.参加カテゴリ.Value) = "" Then
Cancel = True 'フォーカス移動をキャンセル
MsgBox "参加種目が選択されていません", vbOKOnly
End If
End Sub
もし、テキストボックスにフォーカスある状態で未入力の場合はほかのコントロールにフォーカス移動を禁止したいという仕様がご希望なら、一般的には下記のような設計にします。
テキストボックスのフォーカス移動時のイベントプロシージャに下記のコードを設定します。
テキストボックス名が「参加カテゴリ」として、
これで未入力状態では他コントロールへ移動できません。
ただし、このフィールドを入力必須にしたいということなら、これでは不十分です。
このテキストボックスをとばして、他のテキストボックスへ移動したりして、レコード保存操作をすれば未入力のまま保存されます。
この場合は、テーブルデザインで入力必須の設定をするのが確実です。
この行で実行時エラーになるのでしょうか。
また、このコードはどこのどのイベントプロシージャに設定しているのでしょうか。
Sub から End Sub までのコード全体を提示してもらえると状況を把握しやすいです。
どのような状況のときにどのような処理をしたいのかもう少し具体的に説明してください。
[参加カテゴリ]テキストボックスにフォーカスあり未入力(Null値)のとき、他のテキストボックスに移動させたくないということでしょうか。
mayu さん
ありがとうございました。
クエリの方で動作確認させていただきました!
同着の順位付けは以下のように記述します
ただし、DCount関数を使った順位付けは 重たい処理になりますから
クエリの表示速度に難があるようでしたら
hatenaさんが公開されている汎用関数 SetSequenceNumber
を、ご自身のデータベースにインポートしておき、
以下のように呼び出し用のコードを記述して、適当なタイミングで実行するほうがいいでしょう
ありがとうございました。
コマンドボタンに下記記述でできました
本当にありがとうございました。
Private Sub コマンド71_Click()
Me![1投目得点].Locked = True
Me![2投目得点].Locked = True
Me![3投目得点].Locked = True
End Sub
詳細が不明瞭なのでとりあえずヒントだけ。
編集できないようにするにはテキストボックスのLocked プロパティを True に設定します。
mayuさん ありがとうございます。(返信遅れて失礼しました)
サブクエリを使う手がありましたね。確かにこれは時間かければ辿り付いたかもしれません。
でもInStrは全く思いつきませんでした。またJOIN結合でLikeが使うのは絶対に浮かばないアイデアでしたので、勉強になりました。大変お世話になり、本当にありがとうございました。
確かなことはわかりませんが、そのまんま検索すると謎のバグが起きることがあるらしいという情報はありますね
https://www.google.com/search?q=2147467259:引数が無効です
データペースファイルの修復/最適化では修復できませんでした。
手入力した時に出てくるエラーメッセージは、「引数が無効です」でした。
表示された後に、データは入力されています。
何が無効なのか謎ですが、キャッシュがクリアされないでゴミがたまって壊れて壊れた的な状態のような気がします。
カラムが100くらいだと、この症状が出ることはないのですが、
150近くになると、データ型やカラム名を変更していると、たびたび発生するようになります。
officeでは、ここまでだよと言われれば仕方ないのですが、
カラム数にはまだだいぶ余裕があるはずですし。
データ処理に、もっと金使えよ~という事なんでしょうか、、、、、
どうしようもないので、新しくテーブルを作って、ALTER TABLEでカラムを作り直したので、普通に処理できています。
[整理番号]フィールドのデータ型はテキスト型(短いテキスト)ですよね。
このエラーが追加クエリでのエラーと同じ原因の可能性はありそうですか。
念のために下記の手順を試してみてください。
データペースファイルの修復/最適化の実行
それでだめなら、
新規にデータベースファイルを作成して、そこに元ファイルからすべてのオブジェクトをインポートして、この新規ファイルで試してみる。
設定に、違いはありません。
accessは、倉庫として利用しているので、テーブル同士のリレーションシップの機能は利用しておりません。
複製テーブルに、手入力でデータを追加できますが、必ずではない状態です。
整理番号を手入力で追加してみた時も、エラーが出たこともありました。
確か、無効なデータですのようなメッセージが表示された気がします。
-2147467259:引数が無効ですという事なのでしょう。
フィールド数は150程度なので、まだ余裕があります。
ただ、フィールド名やデータ型の変更があったため、これ以上変更できなくなったので構造を複製しました。
今までは、複製すると変更したカウントがチャラになって続行できたのですが、
今回は、この当たりが怪しい気がしておりますが、こんなことが起こるものなのでしょうか?
これだけの情報からは原因を特定するのは難しいです。
このような場合はまずは問題の切り分けをしましょう。
私なら下記のような手順をやってみます。
Accessから元テーブルと複製テーブルをデザインビューで開いて設定に違いがないか確認(データ型、インデックス設定など)
リレーションシップを開いて両者のテーブルのリレーションシップ設定に違いがないか確認
複製テーブルに手入力でデータを追加できるか確認
クエリで同様のSQLを設定して実行してみてデータ追加できるか確認
達成目標に対し、行動目標や手段がそこまで明確なのですから
時間をかけてでも試行錯誤すれば、自ずからご希望の結果が得られたのではないか、と推測します
以下、結果セットが同じになるSQLの記述方法をいくつか載せておきます
■DDL
■データ例
t_摘要t_条件■DML
■結果
質問に書き忘れたのですがLikeは部分一致の Like "*ABC*" ・・・です。
宜しくお願いします。
hirotonさん ありがとうございます。
その後色々コード等変更等している内にCount(*)でも正常になりました。他の処理との兼ね合いだったかもしれません。様子見て見ます。お騒がせしました。
シチュエーションの詳細が不明ですね
この場合の
Me.[tx件数]とCount(*)は完全に同一のものというわけではないので、特定の場合において、Count(*)のつもりでMe.[tx件数]を使用した場合に不具合が起こることはあり得ますCount(*)とRecordset.RecordCountはまず同一とみてかまわないですがhiroton様、mayu様
情報ありがとうございます。
両方とも試してみます!
何とか解決法が見つかりそうで、うれしいです。
ありがとうございました。
ご希望のUIが搭載された
日付ピッカーは、おそらく以下で紹介するようなコンポーネントでしょうなお、Colin Riddington(isladogs)氏作の日付ピッカーを利用する場合、
バージョン 1.5 や 1.6 は入力フォームでのコード量も少ないですし、説明動画も用意されていることから
ご自身で仕組みを理解し、運用なさることをお薦めします
この部分はキーボード操作向けのおまけ対策です
通常、[TAB]で次のコントロール[Shift]+[TAB]で前のコントロールに移動しますが、
・カレンダーを表示
↓
・[ESC]でカレンダーを非表示
↓
・[Shift]+[TAB]で前のコントロールに移動
とすると、「日付」テキストボックスに戻って「日付」テキストボックスのフォーカス取得時イベントが発生して再び「日付カレンダー」に戻ってくる(動かない)ので「日付」テキストボックスを飛ばしてさらにその前のコントロールに移動できるように制御しています
ついでに、いろいろ触っていたら、この状態([ESC]でカレンダーを非表示にした状態)で何か入力するとエラーが発生したので対策を置いておきます
「何か入力」すると、たいていそれは日付として認識できないので、その状態でフォーカスを移動しようとしてエラーが発生します。とりあえず、エラーが発生したら何もしないで再度カレンダー表示に戻すって形で
ACCESSの仕様的に「日付」テキストボックスだけではどうしようもないかなーと思ってます
直接入力を禁止し、カレンダーからしか選べないような形であれば、入力用のテキストボックスを使ってどうにかなるかもしれません
入力用に「日付カレンダー」テキストボックス(非連結)を用意します。幅プロパティを「0cm」にし、「日付」テキストボックスの左端に重なるように設置して見た目上見えないようにします
以下、VBAを使って、「日付カレンダー」(見えないテキストボックス)で日付選択カレンダーを表示し、カレンダーの日付選択時に「日付」テキストボックスに値を設定するサンプルです。
※カレンダーで選択した値を反映させるために変更時('change')イベントを使ってコントロールの移動('setFocus')をしています。「
Me!次のコントロール」は適切なものを指定してくださいご回答ありがとうございます。
テーブルは、「日付」 日付/時刻型フィールド
フォームは、このテーブルがレコードソースになってます。
単票形式フォームです。
非連結テキストボックス 「対象年」、「対象月」があります。
連結テキストボックス「日付」があります。
「日付」を入力する際、カレンダーが表示されますが、
「対象年」と「対象月」が入力されていたらその月のカレンダーを表示してほしいです。
hiroton様
非連結のテキストボックスに入力したら、連結テキストボックスは空欄の状態で、入力する際に日付カレンダーをその月で表示してほしいです。
非連結の月に絞って、ユーザーが連結テキストボックスでカレンダーから入力してほしいです。
どうでしょうか。
日付選択カレンダーを表示したときに選択されている日付は、コントロールに日付が入力されている場合はその日付、入力がない場合は「今日」になるようです
非連結の2つのテキストボックスの更新時で日付フィールドの連結テキストボックスに日付を入力するようにするか、新規レコードの場合であれば、規定値プロパティを変更しても反映されます
ありがとうございます!とても嬉しいです!
やってみます。
最初に訂正を
>> 2ですが、なんでかかっこが漏れているところがありました
(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/(Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))
定義域集計関数と呼ばれる関数(D○○の名前を持ついくつかの関数)はおおよそ同じような記述を行い、「(フィールド名, テーブル/クエリ名, 抽出条件)」のように引数を取ります
すでに出ている例では
で使っていて、抽出条件部分は
"日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#"、実際に計算されるときは例えばのような文字列となって処理されます。この部分がSQLのWhere句に相当する部分となります
任意の日付を用いて特定の年月を対象としたいのであれば、「F01_日報」フォーム上に計算式を作るとして、上記計算では「今日(=
Date())」としていたところをフォーム上のコントロールの参照に置き換えますフォーム上の日付が最大の日付になる場合
さかのぼりで登録することを想定する場合([日付]よりも後の日付がテーブルに保存されている場合=月末日付を求める必要がある場合)
「日付」が入力されるまでは計算式はエラーになるので、Nz関数で補正して、未入力の場合は「今日」で仮に計算する等するとよいかもしれません(
[日付]→Nz([日付],Date()))この抽出条件をそれぞれの定義域集計関数部分に指定してあげてください
多分同様にできると思うので、まずはやってみてください
こちらで教えていただいた下記式について
T01_日報の総売上の合計を取得する際、「F01_日報」上の日付の年月を指定して合計値を求めたい場合はこの式のどこに追加したらいいですか?
これに加えて「T01_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。
宜しくお願いいたします。
(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))
は!本当そのとおりですね!できました。ありがとうございます!!!!😅
文字ならコピペできます
デザインビューで対応していない高度なクエリ(unionクエリやサブクエリなど)を組むことができます
[客数]/[総売上]ではなく[総売上]/[客数]なのでは?
お世話になります。
二つ目のご回答いただいていることに今気が付きました。
2番目の質問はそちらでできそうですね!ありがとうございます☺
ありがとうございます!!
完璧にやりたいことができました。
臨時休業がある時のみ、その日を該当テーブルに登録する処理を追加して教えていただいたコードを記述することにします。
下記2点についても、お手すきの際ご教授ください。。。
1
「客単価(非連結)」を求める式で、希望の答えになりません。
「総売上」フォーカス喪失時に、客単価.requeryをしていて、
客単価には下記式を入力していますが、結果がつねに0になります。
=IIf([総売上]<>0,Int([客数]/[総売上]+0.5),0)
総売上、客単価は通貨型、客数は数値型です。宜しくお願いいたします。
2
このフォーム「F01_日報」のレコードソースは「T01_日報」ですが、フォーム上の「総売上」を
更新したタイミングでその合計値を加算して「その他日割り(非連結)」に表示することはできますか?
このフォームは保存と閉じるのボタンがあり、保存クリック時にイベントを発生させています。
やはり、T01_日報のレコードに保存されてからでないと入力中のレコードの値は利用できませんか?
Private Sub 保存_Click()
On Error Resume Next
strMsg = "登録しますか?"
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub 閉じる_Click()
On Error Resume Next
strMsg = "登録して閉じますか?"
DoCmd.RunCommand acCmdSaveRecord
If Not Me.Dirty Then DoCmd.Close
End Sub
よろしくおねがいいたします😣
続く集計も同様に計算させます
総営業日や定休日を自動計算させる場合の定休日の日数を求めるため、日報を記録し始めた最初の日を取得しておきます
計上の起算日:
DMin("日付","T01_日報")総売り上げの合計は、現在入力中のフォーム上の値を使うことになりますが、未入力状態だとNullになってしまうのでNz関数で補正しておくと良いでしょう
※「日報フォームを遡って表示する」ということを考えていないのでデータの最終日のチェック部分は含んでいません
今日を求める関数:
Date()日付から日部分を求める関数:
Day()今日の日の部分を求める計算式:
Day(Date())当月において、「今日」までの定休日の日数を数える計算式:
DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)※DateDiff関数を使って、先月末日から該当曜日(月曜日)を何回跨いだか?を計算します
定休日を除いた日数:
Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)このような情報は余人の知るところではないので、目的に合わせたデータが必要です。例えば「T_臨時休業日」のようなテーブルを作成し、日付のデータを登録します
今日までの当月の臨時休業の日数: DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")
上記と組み合わせて次の計算式で営業日数が求められます
※どうせ休日を登録するテーブルが必要ならば、単に「T_休業日」として月曜日(定休日)の日付もすべて登録するという方法も考えられます
「営業日数(非連結)」に表示するには、そのまま非連結であってほしい(手入力が可能な状態にしたい)のであれば、VBAを使って適宜上記計算式を呼びだします
たとえば、フォームを読み込んだ時であれば、フォームの読み込み時イベントに[イベント プロシージャ]を設定し当該フォームのモジュールに以下のように記述します
特に営業日数を変更するようなことがないのであれば「営業日数」のコントロールソースに上記計算式をそのまま記述してもよいでしょう。ただし、
vbMondayのようなVBA内でのみ使えるような定数は書き換える必要がありますhatenaさん ありがとうございます。
各グループに段階的に1、-1持たして集計合計の形ですね。応用できる様に工夫してみす。
まずは参考分を理解するようにします。
下記のページの方法が参考になると思います。
レポートでの複雑な集計、グループ化(会計帳票) - hatena chips
簡単に説明すると項目マスターとは別に演算用のグループマスターを作成しておいてそれを結合して集計クエリにするという方法になります。