Access VBA質問箱 IV

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

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


769 / 2272 ツリー ←次へ | 前へ→

【10205】宛名ラベルの余りに・・ あおぎん 08/2/4(月) 13:42 質問[未読]
【10206】Re:宛名ラベルの余りに・・ VBWASURETA 08/2/4(月) 14:18 発言[未読]
【10208】Re:宛名ラベルの余りに・・ 小僧 08/2/5(火) 11:20 回答[未読]
【10214】Re:宛名ラベルの余りに・・ VBWASURETA 08/2/7(木) 13:22 発言[未読]
【10209】Re:宛名ラベルの余りに・・ hatena 08/2/7(木) 8:13 回答[未読]
【10213】Re:宛名ラベルの余りに・・ hatena 08/2/7(木) 11:41 回答[未読]
【10217】Re:宛名ラベルの余りに・・ あおぎん 08/2/7(木) 15:44 お礼[未読]
【10227】Re:宛名ラベルの余りに・・ あおぎん 08/2/8(金) 9:47 質問[未読]
【10230】Re:宛名ラベルの余りに・・ あおぎん 08/2/8(金) 11:00 お礼[未読]
【10233】Re:宛名ラベルの余りに・・ あおぎん 08/2/8(金) 12:19 質問[未読]
【10234】Re:宛名ラベルの余りに・・ hatena 08/2/8(金) 18:38 回答[未読]
【10235】Re:宛名ラベルの余りに・・ あおぎん 08/2/12(火) 8:45 お礼[未読]

【10205】宛名ラベルの余りに・・
質問  あおぎん  - 08/2/4(月) 13:42 -

引用なし
パスワード
   こんにちは。
たびたびお世話になっています。

今回も初歩的な質問ですみませんが、どなたかよろしくお願いします。

宛名ラベル等の印刷時に余りが出る場合、残りを有効利用したいのですが・・・。

こちらで検索をし、【8485】の「宛名ラベルを個別に枚数を指定して印刷する方法」を参考に、余りラベルを活用していたのですが、余りラベル数が少ないものだと滑ってうまく印刷できないので、できれば、最初の印刷時に、同時に余りラベルに任意の宛名を印刷できたらと思うのですが、そんな方法はありますか?

例えば宛名印刷するレコードが35あるとして、ラベルシートは20カットを使用しているので、普通に印刷すると、ラベルが5枚あまってしまうわけなのですが、
この残りの5枚に、常用する任意の宛名を打ち出したいのです。

データのないところにでも罫線を印刷できるので、データのないラベルにもテキストを打ち出せるんじゃないかと試行錯誤してみたのですが、通常のレポートとラベルではかなり勝手が違って、応用が効くというものではなかったです。

やはり必要なデータを作ってから印刷するという方法になるのでしょうか?

よろしくお願いします。

【10206】Re:宛名ラベルの余りに・・
発言  VBWASURETA  - 08/2/4(月) 14:18 -

引用なし
パスワード
   ▼あおぎん さん:

こんにちは。

簡単にするのであれば、レポート用のワークテーブルを用意して
実際に印刷するデータと余り枚数分の常用ラベルデータを
追加するのはダメなのでしょうか?

VBAで非連結ラベルに値を追加する方法はあるにはありますが、
複雑すぎて改造が大変になりそうなのでそちらが良いかと。

【10208】Re:宛名ラベルの余りに・・
回答  小僧  - 08/2/5(火) 11:20 -

引用なし
パスワード
   ▼あおぎん さん、VBWASURETA さん:
こんにちは。

>レポート用のワークテーブルを用意して

VBWASURETA さんご提案の方法です。
以前使っていた、そのままのものですので
あおぎんさんの環境に合わせて適宜変更して下さい。

Private Sub cmdReportOpen_Click()
Const Label_Cnt = 12
Dim strSQL As String
Dim RCount As Long
Dim i As Long
Dim DB As DAO.Database

  DoCmd.RunCommand acCmdSaveRecord

  Set DB = CurrentDb
  
  strSQL = "DELETE FROM W_ラベル"
  DB.Execute strSQL, dbFailOnError
  
  strSQL = "INSERT INTO W_ラベル(顧客ID, 氏名, 郵便番号, 住所1, 住所2 ) " _
      & "SELECT 顧客ID, 氏名, 郵便番号, 住所1, 住所2 " _
      & "FROM T_顧客マスタ " _
      & "WHERE 選択FLG = True"
  DB.Execute strSQL, dbFailOnError
  
  RCount = DCount("*", "W_ラベル")
  
  For i = RCount Mod Label_Cnt + 1 To Label_Cnt
    strSQL = "INSERT INTO W_ラベル( 顧客ID) " _
        & "VALUES(" & RCount + i & ");"
    
    DB.Execute strSQL, dbFailOnError
  Next i
  
  DB.Close
  
  DoCmd.OpenReport "R_ラベル", acViewPreview
End Sub


T_顧客マスタ の選択FLG というフィールドが True の人だけ
ワークテーブル W_ラベル にレコードを追加し、
その後余白分のレコードを追加してレポートを開いております。

レポートのレコードソースは W_ラベルに指定、
W_ラベルの郵便番号、住所等の既定値に
常用ラベルのデータを入れておくと打ち出される仕様です。

Const句の所は

> ラベルシートは20カットを使用しているので

という事で20を指定すれば行けるかと思われます。


汎用的なコードでなく、
実用に合わせるのにちょっと手間が掛かると思いますが
何かご参考になれば幸いです。

【10209】Re:宛名ラベルの余りに・・
回答  hatena  - 08/2/7(木) 8:13 -

引用なし
パスワード
   案1 ユニオンクエリを使う方法

下記のような連番の入ったテーブルを作成します。

T_連番 テーブル
--------
連番  フィールド(数値型)
--------
1
2
3
4



20

1シート20ラベルなら、20まで。

あと、リポートのレコードソースと同じフィールド構成のテーブルを作成して、
名前を T_常用顧客 とします。そこに1件だけ、常用する顧客のデータを入力します。

現状のレポートのレコードソースのクエリは、Q_宛名 と仮定します。

レポートのレコードソースを下記のように設定します。

SELECT 0 AS Type, Q_宛名.* FROM Q_宛名
UNION ALL
SELECT 1 AS Type, T_常用顧客.* FROM T_常用顧客, T_連番
WHERE T_連番.連番 > DCount("*","Q_宛名") Mod 20;

並べ替え/グループ化の設定 で Type の昇順にします。

この方法は、
宛名ラベルを指定位置から指定枚数 印刷する方法
x7net.com/~access/AcTipsRptHowToPrintRabelSpecificNumber.html
で紹介されている連番テーブルを利用する方法の応用です。

案2 は後で投稿します。

【10213】Re:宛名ラベルの余りに・・
回答  hatena  - 08/2/7(木) 11:41 -

引用なし
パスワード
   前回の訂正です。
前回のSQLだと、20件ちょうどを出力するとき、常用顧客が20件出力されてしまいます。

SELECT 0 AS Type, Q_宛名.* FROM Q_宛名
UNION ALL
SELECT 1 AS Type, T_常用顧客.* FROM T_常用顧客, T_連番
WHERE T_連番.連番 > (DCount("*","Q_宛名")-1) Mod 20 + 1;


案2

レポートの「並べ替え/グループ化の設定」で、
フィールド/式 に =1 という固定値の式を設定します。
グループフッターを「はい」にして表示させます。

グループフッターは詳細セクションと同じサイズにして、
常用顧客の宛名をラベルで配置します。
テキストボックスを配置して、
コントロールソース =Count(*)
可視  いいえ
名前  txt件数

グループフッターのフォーマット時、印刷時のコードを下記のように
記述します。

Private Sub グループフッター0_Format(Cancel As Integer, FormatCount As Integer)
  If Me.txt件数 Mod 20 = 0 Then Cancel = True
End Sub

Private Sub グループフッター0_Print(Cancel As Integer, PrintCount As Integer)
  If (Me.txt件数 Mod 20) + PrintCount < 20 Then
    Me.NextRecord = False
  End If
End Sub

【10214】Re:宛名ラベルの余りに・・
発言  VBWASURETA  - 08/2/7(木) 13:22 -

引用なし
パスワード
   ▼あおぎん さん、小僧 さん、hatena さん:

こんにちは。
一応念のためですが、罫線だけという場合のサンプルが
以下のURLにありましたので、ご参考にしてみては。

h tp://www.mahoutsukaino.com/ac/ac2000/monooki/10gyo_insatsu.htm

【10217】Re:宛名ラベルの余りに・・
お礼  あおぎん  - 08/2/7(木) 15:44 -

引用なし
パスワード
   ▼VBWASURETAさん 小僧さん hatenaさん:

お返事遅くなってすみません。
回答をありがとうございました。


説明をはしょっていたのですが、(申し訳ありません)

私がよく作成する宛名ラベルは、社員への配布用に使用するものが多く、
社員ID、所属、役職、氏名データを利用して作成しています。

かたや常用宛名ラベルは、
郵便番号、住所、会社名、部署、などのデータになります。

使用データが微妙に違うので、ワークテーブルを作るのは難しいのではと思い、レポートで処理できないものかなと、当初のような質問をさせていただいた次第です。


●VBWASURETAさん 小僧さん

ワークテーブルに追加する方法を提示していただきありがとうございました。
最初の質問で、

>やはり必要なデータを作ってから印刷するという方法になるのでしょうか?

とお尋ねしていますが、ご提示いただいたような方法をイメージしていました。
ただ、あくまでもイメージで^^; 、きっちり20枚分のレコードを追加するコードの記述方法が具体的にはわかっていなかったので、大変参考になりました。といってもご提示のコードのFor ~Next の使用方法をいまひとつ理解していないので・・、このコードを書いたらどういうことになるのか実際試してみて、わからなければ質問させてください。
ありがとうございました。


●hatenaさん

2つの案ありがとうございました。
案2の方法で今回やりたいことはうまくできました!
案1も大変参考になりました。
ありがとうございました。

【10227】Re:宛名ラベルの余りに・・
質問  あおぎん  - 08/2/8(金) 9:47 -

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

おはようございます。

案2でうまくいったと書いたのですが、
別のラベルで試したところ、うまくいきませんでした。

必要ラベルが9枚で、残り11枚に常用ラベルを印刷しようとしたのですが、
9枚のラベルが9シートに分かれて印刷されるという現象が起こりました。
20カットのうち1枚だけが必要ラベルで残り19枚が常用ラベル ×9シートです。
また数を変更して試してみたところ、10枚のラベルを印刷するのに、2枚と8枚の2シートに分かれて印刷され、残り18枚と12枚が常用ラベルという形にもなりました。

20カット無駄なく印刷しているといえばしているのですが・・。

ちなみにうまくいったラベルは、必要ラベルが2枚で、常用ラベルが18枚ばっちり印刷できました。
その後ラベルのデータ元のレコード数を増減させたら、うまくいかなくなりました。


解決方法がありましたらよろしくお願いします。

(最初に書き忘れてましたが;Win Accessともに2000です。)

【10230】Re:宛名ラベルの余りに・・
お礼  あおぎん  - 08/2/8(金) 11:00 -

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

多分なのですが、原因がわかりました。
並べ替え/グループ化で =1 をグループとして作成したのですが、その上位にすでに並べ替え用にフィールドを入れていたので、それで先ほどのような現象が起きたようです。
削除して、並べ替えプロパティの方で並べ替えを行ったらうまくいきました。
お騒がせしました。

【10233】Re:宛名ラベルの余りに・・
質問  あおぎん  - 08/2/8(金) 12:19 -

引用なし
パスワード
   ▼小僧 さん:
ご提示の方法でワークテーブルを作ってみたのですが、
ワークテーブルはうまくできました。ありがとうございます。

RCount = DCount("*", "W_ラベル")
  
  For i = RCount Mod Label_Cnt + 1 To Label_Cnt
    strSQL = "INSERT INTO W_ラベル( 顧客ID) " _
        & "VALUES(" & RCount + i & ");"

ただ、ここのところなんですが、
例えば31件データがあったとすると、
I は 31 を20 で割り戻した余り11+1から20。
で 31+12〜20の数値が顧客IDに入ってくる処理なのですよね?
選択FLGで抽出した31件のデータ+顧客ID 43〜51の9件の常用データができることになります。

ここで、抽出した顧客IDに44とか48とか混じってますと、顧客IDで並び替えたとき必要なデータと常用データが混じって並んでしまいます。
できれば、選択FLGで抽出したデータの顧客ID順・常用データの順に並び替えたいのですが、この顧客IDをうまく取得する方法はありますか??

もともとの顧客IDをRcountでほぼ取得しない4桁等にする方法くらいしか考え付かないのですが、上記のコードの書き換えで対応できる方法等あればご教示願えませんでしょうか。

よろしくお願いします。

【10234】Re:宛名ラベルの余りに・・
回答  hatena  - 08/2/8(金) 18:38 -

引用なし
パスワード
   ▼あおぎん さん:
>▼hatenaさん:
>
>多分なのですが、原因がわかりました。
>並べ替え/グループ化で =1 をグループとして作成したのですが、その上位にすでに並べ替え用にフィールドを入れていたので、それで先ほどのような現象が起きたようです。

並べ替え/グループ化で =1 グループを最上位に移動させください。

【10235】Re:宛名ラベルの余りに・・
お礼  あおぎん  - 08/2/12(火) 8:45 -

引用なし
パスワード
   ▼hatena さん:
>並べ替え/グループ化で =1 グループを最上位に移動させください。

おはようございます。
最上位にすればいいのですね。
やってみます。
ありがとうございました!

769 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078200
(SS)C-BOARD v3.8 is Free