宜しくお願いします。

エクセルデータの各項目を、すでに書式(表)が印刷された用紙のそれぞれの項目の位置に印刷させたいのですが・・・

各項目には、500行ぐらいのデータがあり、別のワークシートの表示させたい位置(すでに印刷された用紙にあわせてある)に各項目ごとのテキストボックスを作っておいて、そのテキストボックスに各項目のデータを1行ごとに表示させて、テキストボックスのフォント調整、印刷 ~を繰り返したいのですが、どのようなコードを書けばよいのでしょうか?

進め方としては、データシートからテキストボックスに各項目のデータが表示されたら、シート上でテキストボックスのフォントや位置の微調整が出来るようにしておいて、印刷ボタンをクリックすると印刷され、次へのボタンをクリックすると、次の行のデータがテキストボックスに表示されるようにしたい。

※印刷する場合は、テキストボックス内の文字のみ印刷(シートには印刷したくない文字書きたいので・・・)

また、そのフォームには、パターンが5つあって、データには1行ごとにパターン番号が入力されているとして、それぞれのパターンにあわせたテキストボックスの配置してあるシートへ行くようにもしたい。

データの入れ替わりが多いので、別のワークブックと繋がるような仕組みにしておいて、テキストボックスの配置してあるブック側から、データのあるブックを呼びに行ってデータを取りに行くようにしておきたい。

以上、条件が多くてすみませんが、VBAは初心者で、ほんの部分的にしかまだ分かりません。どなたか詳しい方宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (14件中11~14件)

私は同様のケースではVBのツールボックスのコントロールを使っています。


一回、テキストボックスのLinkedCellに設定すればコードが不要になりますし、
元データの加工・変換、演算等がセル上で解決できるからです。(図形も同じ?)

ということで、以下はツールボックスのテキストボックスを使用しています。参考にして下さい。
下記VBAは図形でも同じ理屈で動くはずです。

テキストボックスに表示したい行を2行目に書き込んだとして、(下記VBA)
表示→ツールバー→Visual Basic で表示されたテキストボックスを貼り付け、
テキストボックスを右クリックしてプロパティをだし、
 フォントは  Font で指定
 文字色は   FontColor で指定
 枠を消すなら BackStyle=0、SpecialEffect=0
 テキストの内容は LinkedCell にセル番地をセット
この時点で基本的な画面設定は終らせておきます。後は微調整ですか。

印刷用のSheet1~Sheet5(シート名はこのままを想定)の各シートにコマンドボタンを配置します。
(表示→ツールバー→Visual Basic のツールボックスのコマンドボタンです。)
編集モードでコマンドボタンをダブルクリックして

Private Sub CommandButton1_Click()
Tensou Range("B5") - (Range("B5") = 0) '未入力なら1件目を転送
End Sub

各シート同じです。

どのデータを印刷するか各シートのセルB5にセットするようにしています。
A5には「次の表示行」と入れておけば分かり易い?ボタンもこの近辺がいい?
データシートは1行目に表題があって2行目からデータがあるものとしています。
印刷は微調整後、印刷のアイコンを押します。

下記を標準モジュールに貼り付けます。
 wbNM にデータが入力されているブック名をセットします。
 wsNM にデータがあるシート名
 pattIdx にデータのパターンが登録されている列(Aが1,B列は2)をセットします。

ところで、この処理は事前に印刷された用紙の穴明き部分に再度印刷するような処理と
思われますが、単票を使い、その都度用紙をセットされるのでしょうか。

Public Const wbNM = "OKWEB_Data.xls" 'データがあるブック名
Public Const wsNM = "Sheet1" 'データがあるシート名
Public cl As Integer 'データの列カウンタ
Public st As Integer '印刷するシートのカウンタ
Public Const pattIdx = 5 'データのパターンが登録されている列(Aが1,これはE列を想定)

'tensouNo で指定された行のデータを該当シートに書き込む
Public Sub Tensou(tensouNo As Long)
'データを印刷用シートに書き込む
With Workbooks(wbNM).Worksheets(wsNM).Range("A1")
st = .Offset(tensouNo, pattIdx - 1): If st = 0 Then Exit Sub 'パターンを調べる
Worksheets("Sheet" & st).Activate 'パターンのシートをアクティブにする
For cl = 0 To 4 '行データを書き込む。データはA~E列にあると想定
ActiveSheet.Range("A1").Offset(1, cl) = .Offset(tensouNo, cl)
Next
End With
'次に転送するデータ行を各シートに書き込み
For st = 1 To 5
Worksheets("Sheet" & st).Range("B5") = tensouNo + 1
Next
End Sub

この回答への補足

nishi6さん!こんばんわ!またnishi6さんにはお世話になってしまいました。いつも丁寧なコーディングをありがとうございます。早速、コーディングしてみます。

>ところで、この処理は事前に印刷された用紙の穴明き部分に再度印刷するような
>処理と思われますが、単票を使い、その都度用紙をセットされるのでしょうか。

との質問ですが、その通りです!というか、会社規定の外注で印刷された用紙や外部からの用紙があって、その上に元のデータから必要な部分を手書きしているので、これを印刷で効率を上げようと思ってます。勿論パターン毎に印刷するのである程度は一気にやれるとは思いますが・・・
もしかしてして!!一括印刷ボタンでもつくって、それで一気にってことですか?
実は、それも、ほしい機能です。1行ずつ表示させてから、最後まで確認して問題なければ、一括印刷させるようにもしたいと思っています。途中までいって問題なければ行数を ○行から○行まで印刷する という風にもしたいと思ってます。

この辺でも何かアドバイスがありましたらよろしくお願いします。

※それと、補足で質問ですが・・・
現在、sheet1のパターン番号を自動的に認識させようとしているのですが、その内容は、

例えば、A列とB列にデータがある場合はE列に1を入力
C列とD列にデータがある場合はE列に2を入力
で、このパターンが5通りあります。

という風になるようなVBAを一生懸命考えているのですが分かりません。

前回質問させていただいて以来、プログラムが動いたことに感動して、はじめてのVBAプログラミングと言いう本を見ながら勉強しています。少しずつ分かってくるようにはなってきましたがまだまだです!早く出来るようになりたいと気ばかりが前へいって・・・でも実務は目の前だし・・・って感じで頑張ってます。
何卒宜しくお願いします。

補足日時:2001/05/22 20:20
    • good
    • 0

VBAは最後の手段にしましょう。

VBAを使わない方法を要旨だけ書きます。
例として、データシートをSheet1、印刷シートをSheet2とします。

(1)---テキストボックスに別のシートの値を入れる
テキストボックスをアクティブにして、数式バーに参照元を入れると、テキストボックスにはその値が表示されます。これを利用すれば、VBAなしでセルの値をテキストボックスに反映できます。もちろんフォントや位置の設定も参照元に関係なくできます。例として印刷シート(Sheet2)にテキストボックスを一個配置して"=A1"と入れてみてください。するとA1の値が表示されますね。

(2)---INDEX関数でデータを検索する
データシート(Sheet1)のA1~A500まで500行のデータがあるとします。
次に、印刷シート(Sheet2)のセルA1に
"=INDEX(Sheet1!A1:Sheet1!A500,x)"
と書けば、セルA1にはSheet1のA列のx行目が表示されます。
xの所にB1と入れて、B1のセルの値を1,2,3,4.....と変化させるとSheet1のA列の1,2,3,4.....行目が順々に表示されますね。そうすると、(1)で、テキストボックスの値がセルA1の値とリンクしているので、セルB1の数値を変化させるとテキストボックスの値も変化します。

(3)---ボタンでセルB1の値を変化させる
[フォーム]ツールバーからスピンボタンを選択して、印刷シート(Sheet2)に貼り付けます。スピンボタンの書式設定で[リンクするセル]に"=$B$1"と入れてやれば、スピンボタンの値がB1に表示されますね。あとはボタンを押せば、B1の値が変化して、B1の値を参照しているA1のINDEX関数がSheet1のデータを返すはずです。

最後に、スピンボタンの上下と数値の増減を反転させたり、スピンボタンを印刷しないようにする必要がありますが、可能ですから考えてみてください。
印刷シートが複数あってもこの方法は使えますので、応用問題と思って考えてみましょう。あと、テキストボックスだけ印刷して、シートの文字は印刷しない方法は、セルの色と文字の色を一緒にするマクロを自動記録してみてください。

この回答への補足

TTakさん!すみません!
ひとつ教えてください!
セルに入力されている4桁のデータをバラバラに、1桁ずつテキストボックスに表示される方法はないでしょうか?

セルに表示させる場合は、MID関数を使って1セルに1桁ずつ表示させることは出来たので、一旦この方法で表示させて、テキストボックスに表示させたのですが、問題なのが・・・

(1)予めデータ数を予測して、数式をデータシートに入れて置かないといけないと言う事。で、予測が外れたら計算されない事。
(2)これを、更に5つのパターンに分ける為、ファイル容量が大きくなる事。といううより、計算中から先に進みませんでした。

と言う事で、この辺について教えてください。宜しくお願いします。

補足日時:2001/05/23 19:16
    • good
    • 0
この回答へのお礼

TTakさん!ありがとうございます。早速やってみました。うまく動いてます。
すごいですね! VBAでなくてもこんなことが出来るんですね!あとは頑張って考えます。

お礼日時:2001/05/22 19:57

rurucomさんこんにちは


ずいぶん、実務的なフォーマットをお造りのようですね。がんばってください。
さて、お使いの”テキストボックス”なのですが、実は、シート上に配置できるテキストボックスは2種類あって、[図形描画]ツールバーのコマンドボタンから選択されたものか、[コントロールツールボックス]ツールバーのコマンドボタンから選択されたもかで(マクロ)コードの記述が変わってきます。どちらのテキストボックスかお知らせください。また、EXCELのバージョンもおしえてください。

この回答への補足

TTakさん!よろしくお願いします。TTakさんの回答はいつも参考にさせていただいています。私も早く回答が出来るようになりたいです。

ご質問の件ですが・・・
●[図形描画]ツールバーから選択したものを使って作りたいのです。というの が、シート上でその都度フォントの調整などをしながら印刷させたいからです。

● Excelのバージョンは97です。(会社のPCで作成するので・・・)

説明不足ですみませんでした!よろしくお願いします。

補足日時:2001/05/22 12:45
    • good
    • 0

ワークシート上にテキストボックス(TB1)とコマンドボタン(CB1)を配置して、以下のようにコードを書きます。


(ただし、テキストボックスは、図形描画ツールバーのものではなく、コントロールツールボックスのものを使います。)

Private Sub CB1_Click()
Me.TB1 = Range("A1") 'A1の中身をテキストボックスに転送する
Me.TB1.Font.Name = "MS 明朝" 'フォントをMS 明朝にする
Me.TB1.ForeColor = RGB(255, 0, 0) '色を赤にする
Me.TB1.Font.Size = 20 '20ポイントの大きさにする
Me.PrintOut '印刷する
End Sub

ちなみに、部分的に印刷したくない文字がある場合は、(図形描画ツールバーの)テキストボックスをシートに配置して、テキストを記入し、テキストボックスの書式設定から、「印刷しない」にチェックを付ければいいです。

不明点とかあったら、補足してください。

この回答への補足

すみません! やってみましたが、さっぱり分かりませんでした。すみませんが、詳しく教えていただきたいのですが、宜しくお願いします。

補足日時:2001/05/22 07:50
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング