Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,361 から 2,400 までを表示しています。
1

コードの抜粋ではなく、コード全体を提示してください。

また、どの行でエラーが出るのか、エラーが出たときにエラーメッセージも提示してください。

あと、下記の部分は何を意図したコードか説明してください。

            .Worksheets(1).rows(line_no & ":" & line_no).Select
            .Selection.Copy
            .Worksheets(1).rows(line_no & ":" & line_no + 1).Select
            .Worksheets(1).Paste
8
えいじ 2022/07/10 (日) 23:09:21

ご丁寧に、ありがとうございました。

7

リンク先から転載

'グループ毎の連番を入力する関数
'引数 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

上記のコードをコピーして標準モジュールに貼り付けましたか。

6
えいじ 2022/07/08 (金) 20:05:12
Private Sub コマンド0_Click()
If SetSequenceNumber("順位", "MT_test", "グループID", "売上 DESC,勤怠係数 DESC") Then
     MsgBox "完了"
End If
End Sub

このように記載するという事ですよね。

上部に記載のあるページを参考にしたのですが、

Subまたは、Functionが定義されていませんとエラーが出ます。

申し訳ありません。

5

レポートの詳細セクションのフォーマット時のイベントプロシージャに下記のようなコードを記述することで、強制的に10レコード毎に改ページします。


'詳細のフォーマット時イベント
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

下余白はなるべく小さくしておいて、自動改ページしないようにしておきます。

この2ページ目はレコードがある部分だけ罫線が入り他は何もない空白になります.
この状態があまり見栄えがよろしくないのと、手書きに追記出来るように
レポート出力時空データを作り罫線を作っています.

そういう目的なら、下記で紹介している方法で空データを作成することなくご希望のことか可能です。

レコードがない場合も用紙の最後まで罫線を出力する - hatena chips

レコードがない場合も用紙の最後まで罫線を出力する関数 - hatena chips

レコードがない場合も用紙の最後まで罫線を出力する NextRecord版 - hatena chips

4
セブン 2022/07/08 (金) 13:44:44 修正 da640@b49ca

自動的に改ページされます
一応今7.8mmに設定して各環境とも1ページに同じレコードが入っている状況です.
ただ自分的にはどの環境においても1ページあたりのレコード数が変わらないように
したいと考えております.
理由としては
1ページに50レコードが入るします.
テーブルを元にこのレポートを作っており、このテーブルの中には60レコードあります.
そうすると改ページし10レコードだけ2ページ目に表示されます.
この2ページ目はレコードがある部分だけ罫線が入り他は何もない空白になります.
この状態があまり見栄えがよろしくないのと、手書きに追記出来るように
レポート出力時空データを作り罫線を作っています.
この空データを作る際 テーブルのレコード数からレポートの1ページの最大レコード数を割りそこから足りない数だけ空データを作る処理を行っています.
この1ページの最大レコード数をコードで決め打ちしているため変わってしまうと、
3ページ目に空白のデータだけが表示されるようになります.

以上の理由によりどの環境においても1ページあたりのレコード数が変わらないように
したいと考えております.
長くなりましたがお力添えいただけると幸いです.

3

この縦の一行のレコードが一つ減っている状況です?

この1行は次ページに表示されてますか。

VBAなどて改ページを制御しているわけではなく、自然に改ページされているのでしょうか。

だとしたら、下余白を少し減らしてみたらどうなりますか。
現状、10mmとのことですので、9mmにしてみるとか。
それでだめなら、少しずつ減らしてみてください。

2
セブン 2022/07/08 (金) 10:07:32 修正 da640@b49ca

すいません自分の知識と説明のしかたを間違えてました.
画像添付しますので確認お願いします.

使用プリンターも同じです

印刷プレビュー(アクセス内の)ですでに違いが発生しています.

添付画像は普段のPCでのプレビューです.
この縦の一行のレコードが一つ減っている状況です?

追記 添付画像変更しました.
あくまでイメージになります画像1

5

グループ毎連番を自動入力する関数 - hatena chips

上記の汎用関数のコードをコピーして、標準モジュールに貼り付けます。
そのうえで、下記のコードを実行すればご希望の結果になります。

If SetSequenceNumber("順位", "MT_test", "グループID", "売上 DESC,勤怠係数 DESC") Then
     MsgBox "完了"
End If

フォーム上のコマンドボタンのクリック時のイベントプロシージャ内に記述すれば、ボタンクリックで実行できます。

1

出力時、1ページに5行に分けてデータを出力しており、

1行1レコードということですか。
そして、5レコード毎に改ページしているということですか。

5レコード毎に改ページは、どのように実現してますか。

その別PCは自分のPCとの違いはほぼないのですが、

使用するプリンターは同じですか。

4
えいじ 2022/07/07 (木) 21:18:38

申し訳ありませんでした。
なにもしていません。
CSVファイルを、ACCESSにコピペしています。

紹介していただいたページですが、
同順位だったら書き換えるという条件判定がわかりませんでした。

申し訳ありません。

1
hatena 2022/07/07 (木) 11:39:28 修正

普段使っているPCだと速すぎて確認できないので、
出先のAccess2013で確認してみました。
エクスプローラーを目を凝らしてみてみると、
A.accdb → 最適化 → Database.mdb生成 → A.accdb削除  →  Database.mdbをA.accdbにリネーム
というよう見えました。
accdbなのにmdbなのは違和感がありますが、これまで定期的に最適化をしてきましたが、不具合はなかったです。

ちなみに、accdbファイルの拡張子をmdbに変更しても、Access2007~ファイル形式として開いて問題なく動作します。ファイル形式情報は拡張子ではなくファイル自体が持っているようです。

3

それは最初の質問でわかっています。

順位フィールドにVBAか更新クエリで書き込んでいるのですよね。
それをどのようにしているのか、説明してください。
VBAならコードを、クエリならSQLを提示してください。

どちらにしても、方法は前回の回答のリンク先に説明してありますので、参照してみてください。

2
えいじ 2022/07/06 (水) 23:11:24

グループID ⇒文字型
名前 ⇒文字型
順位 ⇒数値型
売上 ⇒数値型
勤怠係数 ⇒数値型

やりたいこと

売上の高いものから、順位を昇順で振っています。

現在、Aグループの甲、乙が、同順位です。

順位列で、同順位は困ので、同順位が発生した場合、勤怠係数が、小さい方を優先して、昇順で連番を振りたいのです

今回の場合は、

甲⇒売上100
乙⇒売上100

売上では、同順位ですが、

勤怠係数

甲⇒90
乙⇒50

この場合に、甲の順位を2 乙の順位を1としたいのです。

2
まだまだ試行錯誤中 2022/07/06 (水) 13:50:53 c9e7b@a3f19

こんにちは。
この度はご迷惑をお掛け致しました。
オンライン修復にて何とか回復いたしました。
今後はもっと調べてから質問いたします。

1
hatena 2022/07/06 (水) 11:36:00 修正

まず、正確なAccess用語を使うように心がけましょう。
それがあいまいだと情報が正確に伝わらず、無駄なやり取りが発生します。


フォームのフィールドに

フォームにフィールドはありません。
フォーム上に配置したテキストボックスのことですか。


1:本日を表示する(レコードソースは =Date())
2:年度を表示する(レコードソースは =Right(IIf(Month(Date())<=3,Year(Date())-1,Year(Date())),2)

2つのテキストボックス名がそれぞれ、本日を表示する、年度を表示する ということですか。
また、コントロールソースが、=Date()、=Right(IIf(Month(Date())<=3,Year(Date())-1,Year(Date())),2)
ということですか。


を作って、表示及び保存しているのですが、

表示はコントロールソースの設定でできるとして、保存はどこでどのようにしているですか。


突然、「年度を表示する がありません」とメッセージが出るようになり、

エラーメッセージですか。
正確なエラーメッセージを提示してください。
できれば、そのメッセージ画面をキャプチャーして画像でアップロードしてもらうとわかりやすいです。
例えば下記の画像のようなものでしょうか。

画像1

1

MT_test というテーブルに 順位 というフィールドがあり、そのフィールドに順位を書き込みたいという話ですか。

同一順位になる事があるとのことですが、現状のコードを提示してもらえますか。

とりあえず、下記が参考になると思いますので、ご参照ください。

グループ毎連番を自動入力する関数 - hatena chips

5
仕事人(初心者) 2022/07/04 (月) 17:04:23 >> 1

ありがとうございました!
できました

4
仕事人(初心者) 2022/07/04 (月) 17:04:06 >> 2

ありがとうございました!
できました!

3
hiroton 2022/07/04 (月) 08:14:14 be405@f966d >> 1

あと、もっと基本的なところでテーブルを基にしたフォームの作成、フォームウィザードからのフォームの作成もコントロール名=フィールド名になってふりがなの設定もそのまま反映されますね

2

Access:テキストボックスに自動ふりがなを設定する方法
名前などを入力すると自動的に「ふりがな」が表示される設定方法を解説しています。テキストボックスを2つ使い、1つのテキストボックスに入力した文字のふりがなを自動的に、もう1つのテキストボックスに表示させることができます。
feedsoft

1
hiroton 2022/07/01 (金) 17:14:57 49c25@f966d

テキストボックスのふりがなプロパティでふりがなを入力するコントロールを指定できます(その他タブにあります)

既存のフィールドの追加機能を使ってそのままコントロールを配置すればテーブルの設定をそのまま使う(コントロール名=フィールド名になるし、ふりがなプロパティもそのまま設定される)ので特別調整しなくても動くはずですが、個別にテキストボックスを配置してから調整とか、コントロール名を変更していたりする場合は追加でプロパティの調整が必要ですね

5
仕事人(初心者) 2022/07/01 (金) 09:07:01 >> 1

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

実際に試してみたいと思います

4
仕事人(初心者) 2022/07/01 (金) 09:05:21 >> 2

ご多忙にもかかわらず、ご回答ありがとうございます。

ちなみに、退職された方はデータベースから削除します、
質問文に記載しておらず、申し訳ございません。

3

データ型の集計では、Date関数は使えません。結果が変動する関数は使用不可です。
年齢や勤続年数のように変化する値はクエリかフォーム/レポート上で計算するしかないと思います。

2
hiroton 2022/06/30 (木) 18:09:50 b7900@f966d >> 1

回答考えてたら今日は時間が足りなさそうなのでまた今度って思ってたんですが

データ型で集計を使えば計算できます

退社した人のデータはどうするのかな?「退社日」フィールドも必要じゃない?Null判定するか、さらに「退社」フィールド(Yes/No)も追加するかはお好みで

以上、尻切れながら

1

まず、テーブルではそのような計算はできません。
計算はクエリでするようにします。クエリはテーブルと同様に扱えます。

テーブルには「生年月日」「入社日」フィールドはありますか。
あるなら、それと現在日(Date関数)との差を計算すればできます。
クエリで下記のような演算フィールドを作成して、

年齢: (Date()-[生年月日])/365.2425

フィールドのプロパティで書式を 数値、小数点以下桁数を 2 とすればどうでしょう。

※365.2425 は閏年も考慮した1年の日数

5

エリア、店舗別のクロス集計クエリの名前が Q_エリア店舗別 で、 フィールドが、
エリア 店舗 家賃 電気 ガス 水道 備品費 人件費 〇〇費

エリア別のクロス集計クエリの名前が Q_エリア別 で、 フィールドが、
エリア 家賃 電気 ガス 水道 備品費 人件費 〇〇費

だとします。列見出しは固定済みとしまず。

下記のようなSQLで可能だと思います。

SELECT エリア, "" AS 計, 店舗, 家賃, 電気+ガス+水道 AS 水道光熱費, 備品費, 人件費, 〇〇費 FROM Q_エリア店舗別
UNION ALL
SELECT エリア, "計", "", 家賃, 電気+ガス+水道 AS 水道光熱費, 備品費, 人件費, 〇〇費 FROM Q_エリア別
ORDER BY エリア, 計, 店舗;
4

列見出しを固定したら選択可能なフィールド欄に表示されるようになりました。ありがとうございます!
ただ、やはりレポートではなくデータにしたいのでやってみています。
ただ、列の見出しを固定できたことはクエりを実行した際にとても役に立ちました!
ありがとうございました。

16
マイマイ 2022/06/28 (火) 15:59:33

hatena 様

お世話になります。
「テーブル」と「フォーム」だけでなく、「レポート」も絡んでくるのですか。
もう、無理です。
もっと簡単な "桐"に戻ります。
ありがとうございました。

15

 パラメーターの入力 ID という画面が現れます。

ということは、レポートのレコードソースに ID フィールドがないということです。
レポートのレコードソースは、住所録1 で間違いないですか。
住所録1 の主キーフィールドは ID で間違いないですか。

また、以前にお教えいただいたマクロと今回のマクロでは[]の使い方が微妙に違いますが
何か違うのですか。

[ ] があるかどうかの違いですね。通常は[ ]で囲まなくてもいいのですが、オブジェクト名に空白や記号が含まれている場合は囲む必要があります。今回は、フォーム名に空白が含まれていたので[ ]が必要でした。

14
マイマイ 2022/06/28 (火) 14:13:23

hatena 様

お世話になります。
 パラメーターの入力 ID という画面が現れます。
また、以前にお教えいただいたマクロと今回のマクロでは[]の使い方が微妙に違いますが
何か違うのですか。

3

クロス集計クエリからレポートを作成するには、列見出しを固定する必要があります。下記を参考にしてください。

Accessのクロス集計で列を固定する - Qiita

13

マクロのWhere条件式欄に下記でどうでしょうか。

[ID]=[Forms]![F 住所録1]![ID] 
2

ありがとうございます。一番簡単そうなレポートで試してみようかと思いましたが、クロス集計クエリからレポートを作成(ウィザード使おうとしました)することが出来ませんでした。理由がわからないですが、パラメータの入力を求めているからでしょうか? 選択可能なフィールド欄に何も表示されませんでした。

出来ればデータにしたいので、ユニオンクエリで一つにまとめる、というところをやってみたいと思います。またわからないこと質問させていただくかもしれませんがよろしくお願いします。

12
マイマイ 2022/06/28 (火) 11:45:32

hatena 様

お世話になります。
下記の情報で、いいでしょうか。
 テーブル名:住所録1
       項目:ID、〒、住所、氏名
 フォーム名:F 住所録1
       項目:〒、住所、氏名
度々申し訳ございません。
よろしくお願いいたします。

11

あら、もう、諦めてしまうのですか。
あと一歩なのにもったいない。

どうしてもうまく行かないなら、右カラムにファイル送信フォームから現状のファイルを送付してもらえれば、原因を特定して修正法を提示できると思いますよ。

よろしければ、活用ください。

10
マイマイ 2022/06/27 (月) 15:15:56

hatena 様

お世話になります。
確認しつつ行いましたが、うまくいきません。
諦めます。ありがとうございました。

9

マクロのWhere条件式欄は下記の式になってますか。

[顧客ID]=Forms!F_封筒印刷![顧客ID] 

顧客ID は実際の主キーフィールド名
F_封筒印刷 は実際のフォーム名

また、フォームでは、新規レコードではなく、印刷したいレコードを選択した状態ですか。

8
マイマイ 2022/06/27 (月) 09:55:24

hatena 様

ありがとうごいます。
 'レポートを開く'マクロアクションの'Where条件式'引数に無効な値が入力されています。
と表示されます。
どのように対応すればいいでしょうか。