Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2013)
請求書の印刷で「正、副」の印刷(例:カーボンコピー)を実現する方法は
投稿日時: 21/03/27 05:43:06
投稿者: Skit
メールを送信

事務処理(請求書)の合理化を考えています。
 エクセルで所定のフォーム(注記)に入力後 印刷エリアを印刷しますが 同一の様式で正副の印刷出力を得る方法はありませんか?
 
 注記;所定のフォームは 宛先会社名、請求明細項目、合計計算結果などは規定のパターンですが 請求明細項目行のみ行数変更があります。即ち項目数が多いと行数が増加する。
  
 現状は 所定のフォームが上部と下部の2ブロック有り 下部は上部に入力した結果を関数でコピーする形式。
 印刷は上部に(正)と印刷して 下部は(副)と印刷される。 上部域の項目数増加に対応して下部域の行数も合わせて変更の上関数コピーが必要。
 
**かってはインパクトプリンターで簡単にカーボンコピーできたのですが現在はインクジェットのための苦肉の策?
 
 困り事:はエクセルに不慣れの人が 上部(前記)の項目増減に応じた行数変更を可能だが 下部の関数域の操作は正確にできない。 このため 上部の明細行が増減だけで下部域を操作を不要にし(正副)を印刷できる様にしたい。
可能ですか?
 

回答
投稿日時: 21/03/27 08:19:06
投稿者: simple

おはようございます。
 
そもそもで恐縮ですが、
その方式では、上が正、下がカーボンコピーということですが、
その同一性はどう担保されているんですか?
いくらでも正と違う副が作れてしまう気がするんです。
 
二部印刷するか、印刷して社印などを押印してから実コピーをとったほうが副となりそうですけど。
そうでもないですか。
身もふたもない話で恐縮です。

回答
投稿日時: 21/03/27 09:01:28
投稿者: WinArrow
投稿者のウェブサイトに移動

一つの案
 
(正)と(副)を一回の操作で作成する方法です。
 
どちらでもよいが、片方だけ入力/編集します。
 
もう片方が、セル範囲を図形でリンク貼り付けします。
 
両方を一緒に印刷
 
上/下に配置しても、別シートに配置しても構いませんが、
「副」にする方に、「控」とかいう文字をセルに入れておけば、
(リンク貼り付けしても見えるように)
よいのではないでしょうか?

回答
投稿日時: 21/03/27 09:04:34
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
 
VBAの板で質問ですが、
一般機能で充分対応可能と思います。

回答
投稿日時: 21/03/27 19:01:46
投稿者: mattuwan44

セルを参照する数式を、
 
 =if(c5="","".c5)
 
みたいにしておいて、セルにロック掛けておけばよさそうです。

回答
投稿日時: 21/03/27 19:02:25
投稿者: mattuwan44

ごめんなさい誤字。わかって><

投稿日時: 21/03/29 21:49:19
投稿者: Skit
メールを送信

 ○はじめに速やかな返信を頂きありがとう御座います。 当方の返信が遅れて申し訳ありません。
−−−−−−−
 
To: simple 様
 ご指摘の「いくらでも正と違う副が作れてしまう気がするんです。」はその通りですが、直面している書式はお客様から提供されているFormで当方で変更することは出来ません。
  請求項目が増加するときは 正に相当する書式に行追加します。 問題は 副に相当する行も同数追加が必要ですが 副に相当する部分は関数が正の部分をデッドコピーする関数が入っており エクセルの操作が必要で 複数の社員が操作するとき正確性を維持できない。
 
  構造的には --下記の@、A、Bを縦方向に見てください。
   正のブロック @社名     &「正」 A請求明細      B請求額 総計
   副のブロック @と同一の社名 &「副」 A正のコピー(関数) B請求額 総計
 
 私が VBAの板に投げかけた理由は副のブロックを無くして 印刷をVBAで操作して副が出来ないかと 期待したことにあります。 注:前文のお客様指定・・ は副がお客様要求に沿えば問題にはならない。
 ■VBAで「正副 印刷」などのボタンで 項目数が増加しても印刷できる様な機能は実現出来ると良いのですが。
 
To:WinArrow 様
 -- 「副」にする方に、「控」とかいう文字をセルに入れておけば に関して
 現状、ほぼご指摘の形で「副」のブロックには 当該セルに「副」と入っています。 請求明細行は
 「正」セルをコピーする関数が埋め込まれています。
 
  ただご指摘の リンク貼り付け はよく分かりません。
   
 
  問題は「正」の項目数を追加した時 「副」の該当行も追加して修正が必要になります。
 理由は総計行が最下部に配置されている為。総計行が先頭に来て明細行が下部にあると対応しやすいのですが。
 
To:mattuwan44 様
  ご指摘は理解できます、現状は単純に 「副のセル」は=「正のセル」となっています。
  問題は 正側のセルの行数が追加されたとき 困ってしまう。
 
[/b]

回答
投稿日時: 21/03/29 22:54:46
投稿者: WinArrow
投稿者のウェブサイトに移動

> 問題は「正」の項目数を追加した時 「副」の該当行も追加して修正が必要になります。
「正」のセル範囲に「名前定義」しておきます。
 
図のリンク先(数式)のその名前を指定します。
 
「正」の明細表の方は、データ追加数のではなく、最終行を複写→行挿入します。
最後の行を変更します。(結果的に追加したことになる)
 
増えた行は、自動的に図に反映されます。
 

回答
投稿日時: 21/03/31 00:08:42
投稿者: simple

議論のためのたたき台を提示します。
 
(1)マクロtest1は最初に一度だけ実行します。(管理者が一度だけ)
   ・(正)のセル範囲に 名前("正")を付けます。
   ・(副)のセル範囲の最初のセルに 名前("副")を付けます。
(2)その後、いろいろな修正をします。
    ・行の挿入、
    ・行の削除
    ・行の高さの変更
    ・内容の変更等々
(3)最後に、ユーザーがマクロtest2を実行します。動作は以下の内容。
    ・正から副の領域に、行単位でコピー。(書式のほか、行の高さも含めてコピーする意図)
    ・副に数式を設定。
         ・IF(A2="","",A2) のような。(mattuwan44さん方式)
 
これでどうでしょう。
・ミソとしては、行の挿入・削除等を実行しても、
  名前定義の参照範囲は、自動的に伸び縮みしてくれるところでしょうか。
・セル結合とかあっても、問題なさそうです。
 
このほか、何か懸念点はありますか?
正副合わせた縦の長さの調整ですか?
これはユーザーが気をつけてもらうしかないかも。
(まあ、マクロの最初で測定して、警告を発するくらいはできそうですがね。)
 
【以下、参考コード】

Sub test1() '最初に一度だけ実行
    '(正)領域
    ActiveWorkbook.Names.Add Name:="正", RefersTo:="=Sheet1!$A$2:$I$20"
    ' (副)領域の最初のセル
    ActiveWorkbook.Names.Add Name:="副", RefersTo:="=Sheet1!$A$22"
End Sub

Sub test2()
    Dim rngA As Range, rngB As Range, rngC As Range
    Dim s As String

    Set rngA = Range("正")
    Set rngB = Range("副")
    '複写
    rngA.EntireRow.Copy rngB
    '(正)を参照する式を設定
    Set rngC = rngB.Resize(rngA.Rows.Count, rngA.Columns.Count)
    s = rngA(1).Address(False, False)
    rngC.Formula = "=IF(" & s & "=""""" & ",""""," & s & ")"
End Sub

投稿日時: 21/04/02 18:24:01
投稿者: Skit
メールを送信

 相変わらずレスが遅くて申し訳ありません。

To:WinArrow 
  リンク貼り付け の機能は知りませんでしたが今回学習させて頂きました。
 結論的には行数変更時などで希望に添わないと感じています。
 
  ご協力大変ありがとう御座いました。
 
To: simple 様
  サンプルプログラムありがとう御座います。
 感覚的には希望に添っていると思います。 細部について検討させて頂き実用化の報告で考えて行きます。
 
 このようなプログラムを作成出来るようになりたいと思います。
 この度はご協力大変ありがとう御座いました。
 
 
To:回答頂いた各位
 今回の回答を頂き 一応解決済みとさせて頂きます。 また追加の質問が出たときはご支援お願いいたします。ありがとう御座いました。