Access VBA質問箱 IV

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

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


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

【8207】Re:Printoutメソッドのページ指定
回答  hatena E-MAIL  - 06/7/11(火) 15:10 -

引用なし
パスワード
   MDBのテーブルにインポートできていて、
そのままのレイアウトでレポート出力なら、
連結レポートでそのままできそうなものですが、

連結レポートでも、グループ化の機能、「改ページ」プロパティ
など、一般的な機能で、かなりいろいろなことができますよ。

VBAでの、可視の制御、テキストボックスへの代入、NextRecord, MoveLayout
での制御等を使えば、たいていのことはできます。

テーブルのデータ例、そのデータ例からレポートへの出力レイアウト
を提示いただければ、意外と簡単な方法を紹介できるかもしれません。

あと、PrintOut でページ数を指定するより、
OpenReport で抽出条件を設定したほうが効率的だと
思います。
・ツリー全体表示

【8206】Re:Printoutメソッドのページ指定
お礼  sim  - 06/7/11(火) 14:34 -

引用なし
パスワード
   ▼hatena さん:
>まず、最初に、なぜ非連結レポートなのでしょうか。
>その理由、目的をお聞かせいただけませんか。

これは現在開発中のWebシステムの一部です。

1.ブラウザ内の印刷ボタンを押下
2.データを入れたCSVファイル作成
3.CSVをクライアントにダウンロード
4.CSVをそのままMDBのテーブルにインポート
5.帳票作成、印刷

という流れで処理を行います。このとき、CSVからインポート
したデータをそのままのレイアウトで帳票作成しようと
考えていたため、帳票出力時にレコードセットをMoveさせる
必要が生じ、そのため非連結レポートという形で帳票出力を
実現しようとしておりました。

自分でも試しましたが、hatenaさんのおっしゃるとおり、非連結
ではレコードセットの制御が複雑になってしまいますね。CSV
ファイルの出力仕様の方を変更して、連結レポートで実現させて
みようと思います。

勉強になりました。どうもありがとうございました。
・ツリー全体表示

【8205】Re:Printoutメソッドのページ指定
回答  hatena E-MAIL  - 06/7/11(火) 12:06 -

引用なし
パスワード
   まず、最初に、なぜ非連結レポートなのでしょうか。
その理由、目的をお聞かせいただけませんか。

個人的には、非連結レポートにはなんらメリットは
ないと思っています。


ページが飛ばされるのは、レポートヘッダーのフォーマット時で
初期化していないからだと思われます。

レポートは、プレビューから印刷したとき、
プレビューでフォーマット/印刷イベントが発生して、
印刷でもフォーマット/印刷イベントが発生します。

一例を挙げると、10ページのレポートがあり、
プレビューで、2ページまで表示させた。
その後、PrintOut で、8ページから10ページを指定して
印刷したとします。

主なイベントの発生順は、

(プレビュー開始)
 開くとき
 レポートヘッダーフォーマット時/印刷時
 詳細フォーマット時/印刷時(1ページ目)
(次ページを表示)
 詳細フォーマット時/印刷時(2ページ目)
(印刷開始 8〜10ページ指定)
 レポートヘッダーフォーマット時
 詳細フォーマット時(1ページ目)
 詳細フォーマット時(2ページ目)
 ・・・
 詳細フォーマット時(7ページ目)
 詳細フォーマット時/印刷時(8ページ目)
 詳細フォーマット時/印刷時(9ページ目)
 詳細フォーマット時/印刷時(10ページ目)
 レポートフッターフォーマット時/印刷時

とこのように複雑な動きになります。
非連結レポートをこれを完全に把握したうえでないと
コントロールし切れません。

その手間とコード量を考えたら、はるかに通常の連結レポート
のほうが楽でしょう。
・ツリー全体表示

【8204】Re:自分のコードを確認した?
お礼  文進 E-MAIL  - 06/7/11(火) 10:56 -

引用なし
パスワード
   ご指摘ありがとうございます。
VBAは初級で、もっとスキルアップしないと、
質問する資格もありません。反省。
・ツリー全体表示

【8203】Re:自分のコードを確認した?
回答  たん  - 06/7/11(火) 10:45 -

引用なし
パスワード
   自分の書いたコードが何をやっているかを、把握してます?

>  Me.AllowEdits = False

# 他人に質問を行なう前に、自分の書いているコードが何をやっているのかを
# 個々の構文をヘルプ読んで、確認・把握するのは、
# コードを書いた当人が行なうべき、責務です。
# (自分の責務を放り出して、他人に教えてでは、進歩できませんよ)
・ツリー全体表示

【8202】Re:Printoutメソッドのページ指定
質問  sim  - 06/7/11(火) 10:10 -

引用なし
パスワード
   ▼hatena さん:
>レポートのレコードソースは何も設定していないのですか。(非連結レポート?)
>
>その場合、詳細セクションは1行のみになりますが、
>どのように複数ページ出力をしているのですか。

レコードソースを指定していないつもりでつくっていましたが、いつの間にか指定しておりました。不正確な記述で申し訳ありません。レコードソースの指定を削除しましたところ、hatenaさまのおっしゃるとおり、1件分しか出力されなくなりました。追加質問ですが、レコードソースの指定をせずに、1レコードがレポート1枚に対応した帳票(単票?)を複数ページ出力するような処理は可能でしょうか?

>
>>  〜各処理〜
>
>肝心な部分を省略されては、回答しようがありません。

長いのと必要ないかと考えたのとで、省略してしまいました。
冗長となりますが、レポートのイベントを重複部分も含めて再掲いたします。
レポートのレコードソースにはTBL_NAME_PCKが指定してあります。レコード1件と
レポート1枚は基本的に1:1の対応なのですが、レコードの内容によって
2:1の対応になる場合があります。

自分でも調査したところ、2ページ分飛ばされてしまうのは、openReport実行時と
PrintOut時共に詳細_formatが走ってしまうため?と考えています。実際OpenReportをコメントアウトしたところ、飛ばされるのは1ページに減りました。
ですがこの場合、複数プリンタから、同じ開始ページで帳票が出力されてしまいました。PrintOutメソッドは実行時に自らレポートを開いて印刷し、既にOpenしたレポートをそのまま印刷してくれるわけではないということでしょうか?

Option Compare Database
Option Explicit

Private cnn As ADODB.Connection
Private rst As ADODB.Recordset

Private Sub Report_Close()
  rst.Close
  cnn.Close
End Sub

Private Sub Report_Open(Cancel As Integer)
  'テーブルを開く
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  rst.Open TBL_NAME_PCK, cnn, adOpenKeyset, adLockReadOnly

  rst.MoveFirst
  
End Sub

Private Sub 詳細_Print(Cancel As Integer, FormatCount As Integer)
  '全てのコントロールを不可視にする
  Call setCtlVisiblePCK(0, False)
  Call setCtlVisiblePCK(5, False)
  Call setCtlVisibleBLK(1, False)
  Call setCtlVisibleBLK(2, False)
  Call setCtlVisibleBLK(3, False)
  Call setCtlVisibleBLK(4, False)

  'rst!PGBLKSUM =2かつ 次レコードの値がrst!PGBLKSUM =2
  'のとき、レポート1枚に対して2件のレコードを出力する。
  If (rst!PGBLKSUM = 2) Then
    rst.MoveNext
    If rst!PGBLKSUM = 2 Then
      '2:1
      rst.MovePrevious
      'P0,B1に値を入れる
      Call setCtlVisiblePCK(0, True)
      Call setCtlValuePCK(0)
      Call setCtlVisibleBLK(1, True)
      Call setCtlValueBLK(1, 1)
      rst.MoveNext
      'P5,B3に値を入れる
      Call setCtlVisiblePCK(5, True)
      Call setCtlValuePCK(5)
      Call setCtlVisibleBLK(3, True)
      Call setCtlValueBLK(3, 1)
      'B2,B4を不可視
      Call setCtlVisibleBLK(2, False)
      Call setCtlVisibleBLK(4, False)
    Else
      'P0,B1に値を入れる
      Call setCtlVisiblePCK(0, True)
      Call setCtlValuePCK(0)
      Call setCtlVisibleBLK(1, True)
      Call setCtlValueBLK(1, 1)
      'B2,B3,B4,P5を不可視
      Call setCtlVisibleBLK(2, False)
      Call setCtlVisibleBLK(3, False)
      Call setCtlVisibleBLK(4, False)
      Call setCtlVisiblePCK(5, False)
    End If

  Else
    'P0,B1,B2,B3に値を入れる
    Call setCtlVisiblePCK(0, True)
    Call setCtlValuePCK(0)
    Call setCtlVisibleBLK(1, True)
    Call setCtlValueBLK(1, 1)
    Call setCtlVisibleBLK(2, True)
    Call setCtlValueBLK(2, 2)
    Call setCtlVisibleBLK(3, True)
    Call setCtlValueBLK(3, 3)
    
    'B4,P5を不可視
    Call setCtlVisibleBLK(4, False)
    Call setCtlVisiblePCK(5, False)
  End If
  
  rst.MoveNext
  
  If rst.EOF Then
    rst.Close
    cnn.Close
  End If
End Sub

Private Sub setCtlVisiblePCK(i As Integer, blnVisible As Boolean)
  
  Me("UNYOBI" & i).Visible = blnVisible
  Me("ADD1" & i).Visible = blnVisible
  Me("ADD2" & i).Visible = blnVisible
     
      〜省略〜
     
End Subnd Sub

Private Sub setCtlValuePCK(i As Integer)

  Me("UNYOBI" & i) = rst!UNYOBI
  Me("ADD1" & i) = rst!ADD1
  Me("PGTEN" & i) = rst!PGTEN
  Me("PGBLK" & i) = rst!PGBLK
     
      〜省略〜
     
End Sub

Private Sub setCtlVisibleBLK(i As Integer, blnVisible As Boolean)
  
  Me("UNYOBI" & i).Visible = blnVisible
  Me("ADD1" & i).Visible = blnVisible
     
      〜省略〜
End Sub

Private Sub setCtlValueBLK(i As Integer, j As Integer)
  
  Me("BLKCD" & i) = rst("BLKCD" & j)
  Me("BLKNM" & i) = rst("BLKNM" & j)
  Me("PGBLK" & i) = rst("PGBLK" & j)
     
      〜省略〜

End Sub
・ツリー全体表示

【8201】Re:VBA抽出後の変更のやり方
お礼  文進 E-MAIL  - 06/7/11(火) 8:50 -

引用なし
パスワード
   ▼たん さん:
>>1.質問→ある条件でデータ抽出し、画面に抽出分のみ表示されます。しかし、
>
>画面(フォームですよね?)に指定しているレコードソース自体が
>更新不可能なクエリであれば、
>
>抽出した結果は変更出来ません。
>
>> 抽出分データを変更するため、実行コマンドボタンをフォームに
>> 設定しクリックしても変更不可(カーソルが効かない)
>> 一回の処理で、抽出&変更は不可能でしょうか?
>
>もしくは、フォーム自体に更新の許可がされていないとか、
>そのコントロールが、編集ロックされているという可能性もあります。
ご指摘の案件、試行錯誤してみます。有難うございました。
・ツリー全体表示

【8200】Re:均等割付
お礼  yummy  - 06/7/11(火) 8:34 -

引用なし
パスワード
   均等割付できました(^v^)
クロさんありがとうございました!!!
また何かありましたらよろしくお願いします☆
・ツリー全体表示

【8199】Re:VBA抽出後の変更のやり方
発言  文進 E-MAIL  - 06/7/11(火) 8:31 -

引用なし
パスワード
   ▼Gin_II さん:
>>  抽出分データを変更するため、実行コマンドボタンをフォームに
>>  設定しクリックしても変更不可(カーソルが効かない)
>この実行ボタンのクリック時イベントには、どのようなコードを
>入れているのでしょうか?
>★早速の返信有難うございます。
>Private Sub tog許可_afterUpdate()
If Me.tog許可 = True Then
  Me.AllowAdditions = True
  Me.AllowEdits = False
  Me.NavigationButtons = False
  DoCmd.GoToRecord , , acNewRec
  Me.tog許可.Caption = "既レコード編集に切替(&L)"
  Me.Caption = "新規入力画面"
Else
  Me.AllowAdditions = False
  Me.AllowEdits = True
  Me.NavigationButtons = True
  DoCmd.GoToRecord , , acFirst
  Me.tog許可.Caption = "新規レコード入力に切替(&A)"
  Me.Caption = "既存レコード編集画面"
 End If
End Sub
を入れております。


>で、カーソルがきかないとは?
→抽出分データが画面表示され、各項目の変更時、DELETEキーまたは
どの文字も動作しません。よろしくお願いします。
・ツリー全体表示

【8198】Re:VBA抽出後の変更のやり方
回答  たん  - 06/7/11(火) 8:28 -

引用なし
パスワード
   >1.質問→ある条件でデータ抽出し、画面に抽出分のみ表示されます。しかし、

画面(フォームですよね?)に指定しているレコードソース自体が
更新不可能なクエリであれば、

抽出した結果は変更出来ません。

> 抽出分データを変更するため、実行コマンドボタンをフォームに
> 設定しクリックしても変更不可(カーソルが効かない)
> 一回の処理で、抽出&変更は不可能でしょうか?

もしくは、フォーム自体に更新の許可がされていないとか、
そのコントロールが、編集ロックされているという可能性もあります。
・ツリー全体表示

【8197】Re:Printoutメソッドのページ指定
回答  hatena E-MAIL  - 06/7/10(月) 23:21 -

引用なし
パスワード
   レポートのレコードソースは何も設定していないのですか。(非連結レポート?)

その場合、詳細セクションは1行のみになりますが、
どのように複数ページ出力をしているのですか。

>  〜各処理〜

肝心な部分を省略されては、回答しようがありません。
・ツリー全体表示

【8196】Re:件数指定のSQLについて
回答  hatena E-MAIL  - 06/7/10(月) 23:17 -

引用なし
パスワード
   >SQLにて、n件目からmレコード取得を行いたいのですが
>(Oracleでいうとrow_number)Accessでは、このような
>取得の仕方はできないのでしょうか。
>
>先頭レコードからmレコードであればtopでできるのですが
>n件目という指定の仕方がいろいろ調べても見つかりません。

たとえば、
テーブルを T1
並び順を決定するキーフィールドを ID
として、20番目から10レコード抽出する場合の
SQLは、1例を挙げると、

SELECT TOP 10 T1.*
FROM T1
WHERE
ID >
(SELECT Max(ID)
 FROM
  (SELECT TOP 20 ID
  FROM T1
  ORDER BY ID))
ORDER BY ID;

>やはり上記の方法を実現するには、テーブル内に番号等の
>フィールドを持つしかないのでしょうか。

それがあれば、もっと簡単にできますね。
・ツリー全体表示

【8195】Re:件数指定のSQLについて
回答  sim  - 06/7/10(月) 20:28 -

引用なし
パスワード
   ▼くろすけ さん:

>先頭レコードからmレコードであればtopでできるのですが
>n件目という指定の仕方がいろいろ調べても見つかりません。

若輩者ですが先ほど自分が調べたことと被りましたので。
未テストですが参考になればと思います。

  Dim strArray() As String
  Dim cnn As ADODB.Connection
  Dim rst As ADODB.Recordset
  
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  
  rst.Open "テーブル名", cnn, adOpenKeyset, adLockReadOnly

  rst.Move n-1

  For i = 1 To m
    rst.MoveNext
    ReDim Preserve strArray(i)
    strArray(i) = rst!項目名
  Next i
・ツリー全体表示

【8194】Printoutメソッドのページ指定
質問  sim  - 06/7/10(月) 20:08 -

引用なし
パスワード
   環境: Access 2003
   Windows XP Pro

度々お世話になっております。simと申します。

現在、以下のようなコード(1.)で帳票出力処理を作成しております。
帳票を、複数のプリンターに対して、指定した開始、終了ページ数で
出力したいと考えております。プリンターはテーブルに登録されており、
開始ページ、出力ページのカラムを持っています。

この関数のprintoutメソッドにてページ指定をして出力したところ、
最初の2ページが飛ばされて印刷されてしまう状況です(例:1〜6ページを
指定すると、3〜8ページが出力される)。

留意点として、この帳票は、特定のレコードソースを持たず、Open時に読み
こんだレコードセットを、詳細_Format時に一行ずつ読み込んでレポートを
出力するつくりになっております(コード2.)。一ページに対し、レコード
セット一行が対応します。このあたりが悪さをしていると思われますが、
printoutメソッドが悪いのか、format時イベントが悪いのか切り分けが
できません。

とりあえずprintoutメソッドの使用法に間違いがあるのかと考え、投稿
させていただきました。printoutメソッドについて情報をお持ちの方、
よろしくご教示ください。

1. PrintOutメソッド使用プロシージャ

  DoCmd.openReport REPORT_NAME, acViewPreview, , , , acHidden
  DoCmd.SelectObject acReport, REPORT_NAME, True
  
  'テーブルを開く
  Set Prtcnn = CurrentProject.Connection
  Set Prtrst = New ADODB.Recordset
  
  Prtrst.Open "select * from " & TBL_NAME_PRT_PCK & " where SIYO_FLG=true order by PAGE_FROM ", Prtcnn, adOpenKeyset, adLockReadOnly
  
  Prtrst.MoveFirst
  
  Do Until Prtrst.EOF
    strPrinter = Prtrst!PRT_NM
    Set prt = Application.Printers(strPrinter)
    Set Application.Printer = prt
    
    DoCmd.PrintOut acPages, Prtrst!PAGE_FROM, Prtrst!PAGE_TO
    
    Prtrst.MoveNext
  
  Loop

  DoCmd.Close acReport, REPORT_NAME, acSaveNo

  Prtrst.Close
  Prtcnn.Close

2.帳票イベント

Private Sub Report_Open(Cancel As Integer)
  'テーブルを開く
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  rst.Open TBL_NAME_PCK, cnn, adOpenKeyset, adLockReadOnly

  rst.MoveFirst
  
End Sub

Private Sub 詳細_Print(Cancel As Integer, FormatCount As Integer)
  
  〜各処理〜
   
  rst.MoveNext
  
  If rst.EOF Then
    rst.Close
    cnn.Close
  End If
End Sub
・ツリー全体表示

【8193】件数指定のSQLについて
質問  くろすけ  - 06/7/10(月) 18:36 -

引用なし
パスワード
   はじめまして。
AccessのSQLで悩んでいます。

SQLにて、n件目からmレコード取得を行いたいのですが
(Oracleでいうとrow_number)Accessでは、このような
取得の仕方はできないのでしょうか。

先頭レコードからmレコードであればtopでできるのですが
n件目という指定の仕方がいろいろ調べても見つかりません。

やはり上記の方法を実現するには、テーブル内に番号等の
フィールドを持つしかないのでしょうか。

どなたかご存知の方がいらっしゃいましたら返信宜しくお願いします。
・ツリー全体表示

【8192】Re:VBA抽出後の変更のやり方
発言  Gin_II  - 06/7/10(月) 18:02 -

引用なし
パスワード
   >  抽出分データを変更するため、実行コマンドボタンをフォームに
>  設定しクリックしても変更不可(カーソルが効かない)

この実行ボタンのクリック時イベントには、どのようなコードを
入れているのでしょうか?

で、カーソルがきかないとは?
・ツリー全体表示

【8191】VBA抽出後の変更のやり方
質問  文進 E-MAIL  - 06/7/10(月) 16:59 -

引用なし
パスワード
   アクセス/VBAの初心者で裏技等の教本でスキルアップしております。
1.質問→ある条件でデータ抽出し、画面に抽出分のみ表示されます。しかし、
 抽出分データを変更するため、実行コマンドボタンをフォームに
 設定しクリックしても変更不可(カーソルが効かない)
 一回の処理で、抽出&変更は不可能でしょうか?
・ツリー全体表示

【8189】Re:均等割付
発言  クロ  - 06/7/10(月) 16:30 -

引用なし
パスワード
   レポート:均等割付による印刷(横書き)
http://www.ruriplus.com/msaccess/tch/tch_025.html

レポート:均等割付による印刷(縦書き)
http://www.ruriplus.com/msaccess/tch/tch_030.html

レポート:均等割付による印刷(テキストボックス指定)
http://www.ruriplus.com/msaccess/tch/tch_031.html

ここらが参考になるかと…
・ツリー全体表示

【8188】均等割付
質問  yummy  - 06/7/10(月) 14:42 -

引用なし
パスワード
   またまたお世話になります。

「Access97のレポートの均等割付」についてなんですが、
このサイトの過去の記録や、ネットで調べたりして有力情報があってもVBAがまだまだ未熟なので、どうもいまいち分からずにいます。

そこで、どこか分かりやすいサイトや、助言をいただけるとありがたいです(- -;)
よろしくお願いします!!!
・ツリー全体表示

【8187】Re:印刷時について教えて下さい。
お礼  yummy  - 06/7/10(月) 11:57 -

引用なし
パスワード
   ▼hatena さん:
>プリンタには印刷可能範囲というのがあります。それを超える
>余白は設定できません。もし、できたとしても、印刷できません。
>
>Accessの問題ではなく、プリンタの性能の制限です。
>「ふちなし印刷」の可能なプリンタなら、0mm に設定できます。

プリンタを調べてみましたが、どうも4.2mmが精一杯らしく、
0mmは無理でした(TOT)

hatenaさんありがとうございました(^u^)
・ツリー全体表示

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