'グループ毎の連番を入力する関数
'引数 FieldName:連番を格納するフィールド名(データ型は数値型)
' TableName:対象のテーブル名またはクエリ名(パラメータクエリは不可)
' GroupBy:グループ化するフィールド名(省略可能)
' 複数フィールドをカンマ区切りで指定可能
' 省略した場合は全レコードを通しての連番になります。
' Orderby:並べ替えするフィールド名(省略可能)
' SQLのORDER BY句内の式と同一
' 省略した場合は並び順は不定になります。
' WhereCondition:抽出条件式(省略可能)
' SQLのOWHERE句内の式と同一
' 省略した場合は全レコードが対象になります。
'使用上の注意: DAO ライブラリへの参照設定が必要です。
Public Function SetSequenceNumber( _
FieldName As String, _
TableName As String, _
Optional GroupBy As String, _
Optional Orderby As String, _
Optional WhereCondition As String) As Boolean
Dim ws As DAO.Workspace
Dim rs As DAO.Recordset
Dim c As Long, GCnt As Long, i As Long
Dim strSQL As String, strOrderby As String
Dim v() As String
Const CommitInterval As Long = 5000 'トランザクションをコミットする間隔
Dim TranCount As Long
Dim TranBegin As Boolean
On Error GoTo ErrHdl
SetSequenceNumber = True
'SQL文生成
strSQL = "SELECT " & FieldName
If LenB(GroupBy) > 0 Then
strSQL = strSQL & ", " & GroupBy
strOrderby = "," & GroupBy
End If
strSQL = strSQL & " FROM " & TableName
If LenB(WhereCondition) > 0 Then strSQL = strSQL & " WHERE " & WhereCondition
If LenB(Orderby) > 0 Then strOrderby = strOrderby & "," & Orderby
If LenB(strOrderby) > 0 Then strSQL = strSQL & " ORDER BY " & Mid$(strOrderby, 2)
strSQL = strSQL & ";"
Set ws = DBEngine.Workspaces(0)
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
'グループ化するフィールド数分の動的配列確保
GCnt = UBound(Split(GroupBy, ","))
If GCnt > -1 Then ReDim v(GCnt)
'連番書き込みループ
TranCount = 0
ws.BeginTrans: TranBegin = True
Do Until rs.EOF
For i = 0 To GCnt
If v(i) = rs(i + 1) Then
Else
c = 0
v(i) = rs(i + 1)
End If
Next
c = c + 1
rs.Edit
rs(0) = c
rs.Update
rs.MoveNext
'↓対象レコード件数が多い時に共有ロック数エラーが出る時の対策用
TranCount = TranCount + 1
If TranCount = CommitInterval Then
ws.CommitTrans
ws.BeginTrans
TranCount = 0
End If
Loop
ws.CommitTrans: TranBegin = False
Ext:
On Error Resume Next
rs.Close
Set rs = Nothing
Set ws = Nothing
Exit Function
ErrHdl:
MsgBox Err & ":" & Err.Description
SetSequenceNumber = False
If TranBegin Then ws.Rollback
Resume Ext
End Function
'詳細のフォーマット時イベント
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If Me.CurrentRecord Mod 10 = 0 Then
Me.詳細.ForceNewPage = 2 'カレントセクションの後で改ページ
Else
Me.詳細.ForceNewPage = 0 '改ページしない
End If
End Sub
SELECT エリア, "" AS 計, 店舗, 家賃, 電気+ガス+水道 AS 水道光熱費, 備品費, 人件費, 〇〇費 FROM Q_エリア店舗別
UNION ALL
SELECT エリア, "計", "", 家賃, 電気+ガス+水道 AS 水道光熱費, 備品費, 人件費, 〇〇費 FROM Q_エリア別
ORDER BY エリア, 計, 店舗;
コードの抜粋ではなく、コード全体を提示してください。
また、どの行でエラーが出るのか、エラーが出たときにエラーメッセージも提示してください。
あと、下記の部分は何を意図したコードか説明してください。
ご丁寧に、ありがとうございました。
リンク先から転載
上記のコードをコピーして標準モジュールに貼り付けましたか。
このように記載するという事ですよね。
上部に記載のあるページを参考にしたのですが、
Subまたは、Functionが定義されていませんとエラーが出ます。
申し訳ありません。
レポートの詳細セクションのフォーマット時のイベントプロシージャに下記のようなコードを記述することで、強制的に10レコード毎に改ページします。
下余白はなるべく小さくしておいて、自動改ページしないようにしておきます。
そういう目的なら、下記で紹介している方法で空データを作成することなくご希望のことか可能です。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
レコードがない場合も用紙の最後まで罫線を出力する関数 - hatena chips
レコードがない場合も用紙の最後まで罫線を出力する NextRecord版 - hatena chips
自動的に改ページされます
一応今7.8mmに設定して各環境とも1ページに同じレコードが入っている状況です.
ただ自分的にはどの環境においても1ページあたりのレコード数が変わらないように
したいと考えております.
理由としては
1ページに50レコードが入るします.
テーブルを元にこのレポートを作っており、このテーブルの中には60レコードあります.
そうすると改ページし10レコードだけ2ページ目に表示されます.
この2ページ目はレコードがある部分だけ罫線が入り他は何もない空白になります.
この状態があまり見栄えがよろしくないのと、手書きに追記出来るように
レポート出力時空データを作り罫線を作っています.
この空データを作る際 テーブルのレコード数からレポートの1ページの最大レコード数を割りそこから足りない数だけ空データを作る処理を行っています.
この1ページの最大レコード数をコードで決め打ちしているため変わってしまうと、
3ページ目に空白のデータだけが表示されるようになります.
以上の理由によりどの環境においても1ページあたりのレコード数が変わらないように
したいと考えております.
長くなりましたがお力添えいただけると幸いです.
この1行は次ページに表示されてますか。
VBAなどて改ページを制御しているわけではなく、自然に改ページされているのでしょうか。
だとしたら、下余白を少し減らしてみたらどうなりますか。
現状、10mmとのことですので、9mmにしてみるとか。
それでだめなら、少しずつ減らしてみてください。
すいません自分の知識と説明のしかたを間違えてました.
画像添付しますので確認お願いします.
使用プリンターも同じです
印刷プレビュー(アクセス内の)ですでに違いが発生しています.
添付画像は普段のPCでのプレビューです.
この縦の一行のレコードが一つ減っている状況です?
追記 添付画像変更しました.
あくまでイメージになります
グループ毎連番を自動入力する関数 - hatena chips
上記の汎用関数のコードをコピーして、標準モジュールに貼り付けます。
そのうえで、下記のコードを実行すればご希望の結果になります。
フォーム上のコマンドボタンのクリック時のイベントプロシージャ内に記述すれば、ボタンクリックで実行できます。
1行1レコードということですか。
そして、5レコード毎に改ページしているということですか。
5レコード毎に改ページは、どのように実現してますか。
使用するプリンターは同じですか。
申し訳ありませんでした。
なにもしていません。
CSVファイルを、ACCESSにコピペしています。
紹介していただいたページですが、
同順位だったら書き換えるという条件判定がわかりませんでした。
申し訳ありません。
普段使っているPCだと速すぎて確認できないので、
出先のAccess2013で確認してみました。
エクスプローラーを目を凝らしてみてみると、
A.accdb → 最適化 → Database.mdb生成 → A.accdb削除 → Database.mdbをA.accdbにリネーム
というよう見えました。
accdbなのにmdbなのは違和感がありますが、これまで定期的に最適化をしてきましたが、不具合はなかったです。
ちなみに、accdbファイルの拡張子をmdbに変更しても、Access2007~ファイル形式として開いて問題なく動作します。ファイル形式情報は拡張子ではなくファイル自体が持っているようです。
それは最初の質問でわかっています。
順位フィールドにVBAか更新クエリで書き込んでいるのですよね。
それをどのようにしているのか、説明してください。
VBAならコードを、クエリならSQLを提示してください。
どちらにしても、方法は前回の回答のリンク先に説明してありますので、参照してみてください。
グループID ⇒文字型
名前 ⇒文字型
順位 ⇒数値型
売上 ⇒数値型
勤怠係数 ⇒数値型
やりたいこと
売上の高いものから、順位を昇順で振っています。
現在、Aグループの甲、乙が、同順位です。
順位列で、同順位は困ので、同順位が発生した場合、勤怠係数が、小さい方を優先して、昇順で連番を振りたいのです
今回の場合は、
甲⇒売上100
乙⇒売上100
売上では、同順位ですが、
勤怠係数
甲⇒90
乙⇒50
この場合に、甲の順位を2 乙の順位を1としたいのです。
こんにちは。
この度はご迷惑をお掛け致しました。
オンライン修復にて何とか回復いたしました。
今後はもっと調べてから質問いたします。
まず、正確なAccess用語を使うように心がけましょう。
それがあいまいだと情報が正確に伝わらず、無駄なやり取りが発生します。
フォームにフィールドはありません。
フォーム上に配置したテキストボックスのことですか。
2つのテキストボックス名がそれぞれ、本日を表示する、年度を表示する ということですか。
また、コントロールソースが、=Date()、=Right(IIf(Month(Date())<=3,Year(Date())-1,Year(Date())),2)
ということですか。
表示はコントロールソースの設定でできるとして、保存はどこでどのようにしているですか。
エラーメッセージですか。
正確なエラーメッセージを提示してください。
できれば、そのメッセージ画面をキャプチャーして画像でアップロードしてもらうとわかりやすいです。
例えば下記の画像のようなものでしょうか。
MT_test というテーブルに 順位 というフィールドがあり、そのフィールドに順位を書き込みたいという話ですか。
同一順位になる事があるとのことですが、現状のコードを提示してもらえますか。
とりあえず、下記が参考になると思いますので、ご参照ください。
グループ毎連番を自動入力する関数 - hatena chips
ありがとうございました!
できました
ありがとうございました!
できました!
あと、もっと基本的なところでテーブルを基にしたフォームの作成、フォームウィザードからのフォームの作成もコントロール名=フィールド名になってふりがなの設定もそのまま反映されますね
テキストボックスのふりがなプロパティでふりがなを入力するコントロールを指定できます(その他タブにあります)
既存のフィールドの追加機能を使ってそのままコントロールを配置すればテーブルの設定をそのまま使う(コントロール名=フィールド名になるし、ふりがなプロパティもそのまま設定される)ので特別調整しなくても動くはずですが、個別にテキストボックスを配置してから調整とか、コントロール名を変更していたりする場合は追加でプロパティの調整が必要ですね
ご回答ありがとうございます。
実際に試してみたいと思います
ご多忙にもかかわらず、ご回答ありがとうございます。
ちなみに、退職された方はデータベースから削除します、
質問文に記載しておらず、申し訳ございません。
データ型の集計では、Date関数は使えません。結果が変動する関数は使用不可です。
年齢や勤続年数のように変化する値はクエリかフォーム/レポート上で計算するしかないと思います。
回答考えてたら今日は時間が足りなさそうなのでまた今度って思ってたんですが
データ型で集計を使えば計算できます
退社した人のデータはどうするのかな?「退社日」フィールドも必要じゃない?Null判定するか、さらに「退社」フィールド(Yes/No)も追加するかはお好みで
以上、尻切れながら
まず、テーブルではそのような計算はできません。
計算はクエリでするようにします。クエリはテーブルと同様に扱えます。
テーブルには「生年月日」「入社日」フィールドはありますか。
あるなら、それと現在日(Date関数)との差を計算すればできます。
クエリで下記のような演算フィールドを作成して、
フィールドのプロパティで書式を 数値、小数点以下桁数を 2 とすればどうでしょう。
※365.2425 は閏年も考慮した1年の日数
エリア、店舗別のクロス集計クエリの名前が
Q_エリア店舗別
で、 フィールドが、エリア 店舗 家賃 電気 ガス 水道 備品費 人件費 〇〇費
エリア別のクロス集計クエリの名前が
Q_エリア別
で、 フィールドが、エリア 家賃 電気 ガス 水道 備品費 人件費 〇〇費
だとします。列見出しは固定済みとしまず。
下記のようなSQLで可能だと思います。
列見出しを固定したら選択可能なフィールド欄に表示されるようになりました。ありがとうございます!
ただ、やはりレポートではなくデータにしたいのでやってみています。
ただ、列の見出しを固定できたことはクエりを実行した際にとても役に立ちました!
ありがとうございました。
hatena 様
お世話になります。
「テーブル」と「フォーム」だけでなく、「レポート」も絡んでくるのですか。
もう、無理です。
もっと簡単な "桐"に戻ります。
ありがとうございました。
ということは、レポートのレコードソースに ID フィールドがないということです。
レポートのレコードソースは、住所録1 で間違いないですか。
住所録1 の主キーフィールドは ID で間違いないですか。
[
]
があるかどうかの違いですね。通常は[
]
で囲まなくてもいいのですが、オブジェクト名に空白や記号が含まれている場合は囲む必要があります。今回は、フォーム名に空白が含まれていたので[
]
が必要でした。hatena 様
お世話になります。
パラメーターの入力 ID という画面が現れます。
また、以前にお教えいただいたマクロと今回のマクロでは[]の使い方が微妙に違いますが
何か違うのですか。
クロス集計クエリからレポートを作成するには、列見出しを固定する必要があります。下記を参考にしてください。
Accessのクロス集計で列を固定する - Qiita
マクロのWhere条件式欄に下記でどうでしょうか。
ありがとうございます。一番簡単そうなレポートで試してみようかと思いましたが、クロス集計クエリからレポートを作成(ウィザード使おうとしました)することが出来ませんでした。理由がわからないですが、パラメータの入力を求めているからでしょうか? 選択可能なフィールド欄に何も表示されませんでした。
出来ればデータにしたいので、ユニオンクエリで一つにまとめる、というところをやってみたいと思います。またわからないこと質問させていただくかもしれませんがよろしくお願いします。
hatena 様
お世話になります。
下記の情報で、いいでしょうか。
テーブル名:住所録1
項目:ID、〒、住所、氏名
フォーム名:F 住所録1
項目:〒、住所、氏名
度々申し訳ございません。
よろしくお願いいたします。
あら、もう、諦めてしまうのですか。
あと一歩なのにもったいない。
どうしてもうまく行かないなら、右カラムにファイル送信フォームから現状のファイルを送付してもらえれば、原因を特定して修正法を提示できると思いますよ。
よろしければ、活用ください。
hatena 様
お世話になります。
確認しつつ行いましたが、うまくいきません。
諦めます。ありがとうございました。
マクロのWhere条件式欄は下記の式になってますか。
顧客ID は実際の主キーフィールド名
F_封筒印刷 は実際のフォーム名
また、フォームでは、新規レコードではなく、印刷したいレコードを選択した状態ですか。
hatena 様
ありがとうごいます。
'レポートを開く'マクロアクションの'Where条件式'引数に無効な値が入力されています。
と表示されます。
どのように対応すればいいでしょうか。