宜しくお願いします。

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

各項目には、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リストボックスで選択した項目のデータとワークシートのデータを比較したい

Excel2003を使用しています。

個人用マクロブックにユーザーフォームを作成し、年と週を入力するリストボックスとコマンドボタンを配置しました。
Listbox1では年(2005,2006,2007)、Listbox2では週(01,02・・・・,53)
が選択できるようになっています。
コマンドボタンをクリックすると、Listbox1とListbox2で選択した項目を取得し、hizuke という変数に代入します(例:2005 02)。

hizuke の値を 既に開いているcsvファイルから検索し、一致しているセルを選択したいのですが、どうしても同じものと認識してくれません。

hizukeのデータ型はStringにしていますが、何か問題があると思われますか?

どうぞご教授ください。宜しくお願い致します。

Aベストアンサー

>hizukeのデータ型はStringにしていますが、何か問題があると思われますか?
これはCSVのデータを見てみないと何とも言えませんが、CSVのデータが文字列型で入力されているなら問題はありません。

でもhizuke変数の例として"2005 02"とありますが、実際には途中の空白がなく "200502"だとすると、CSVの"200502"は数値となるので、型が一致しないため検索してもヒットしないでしょう。

また個人用マクロブックではなく、CSVシートの標準モジュールシートにそのマクロを貼り付けて実行したら違う結果になりませんか?
その場合はシートオブジェクトの指定が曖昧になっており、意図するシートを検索していない可能性もあります。

いずれにせよ質問文ではどんなデータ、どんなマクロか具体的に記載がないので、「想像」で回答するしかありません。お互い無駄だと思いませんか? 結果を早く手に入れたいならデータの一部と、マクロを掲載した方がよいですよ。

Qデータシートから各シートへデータを貼り付けるマクロ

いつもお世話になっております。
現在、データシートから各シートへデータを入力するマクロを作成しようとしています。

ブックの一枚目のシートにデータシートがあり
データシートは以下のようになっています

A   B     C     D     E    F   G
No  社員番号 氏名   所属   日付  数値1 数値2
1 1 123  ○○××  AAA  2016/1  30   20
2 2 123  ○○××  AAA  2016/2  40   15
3 3 123  ○○××  AAA  2016/3  20   90
. .
. .
. .
12 12   123  ○○××  AAA  2016/12  70   50
13 12   345  □□△△  BBB  2016/1   20   60
14 12   345  □□△△  BBB  2016/2   40   10
.
.
.

タイトル行は実際には存在しません
各シートは所属別に分かれていて各所属人数はまちまちです。

データシートを上から順に調べ、各シートの該当社員の該当セルへを貼付したいです。
コピーする範囲は7項目×12月分の全ての部分(最初の人で言えばA1:G12の範囲)
貼り付ける範囲は各シートに社員毎に表があるのでセルとしては社員番号の右上(Offset(該当セル,-1,1)へ貼付)

流れとしては
まず一枚目のB列を上から順に12個飛ばしで取得する(最初はB1)
Offset("B1",0,-1,12,7)の範囲をコピーする
次に4枚目のワークシートから調べていく(2,3枚目は別の必要なデータがあるため)
4枚目のワークシートのB列を調べ、取得した値と一致すればOffset(該当セル,-1,1)の位置に貼付
なければ検索を続け、そのシートに該当する社員番号がなければ次のシートへ
これを最終シートまで繰り返し、また一枚目のワークシートの検索からはじめる

といった処理をしたいと考えています。

自力で考えたものが下のものです

-------------------------------------------
Sub テスト()

Dim results As Variant, i As Long, j As Long, k As Long

With Worksheets(1)
Do Until Cells(i, 2) = ""
Worksheets(1).Range.Offset(Cells(i, 2), 0, -1, 12, 7).Copy
For j = 4 To Worksheets.Count
Sheets(Sheets(j).Name).Select
For k = 1 To 100
If Worksheets(1).Cells(i, 2) = Worksheets(j).Cells(k, 2) Then
Worksheets(j).Active.Range.Offset(Cells(k, 2), -1, 1).PasteSpecial Paste:=xlPasteValues

End If
Next k
Next j

i = i + 12
Loop
End With
End Sub
----------------------------------------------

そもそもこんな単純なものではないとは思っていて、根本的に間違っているかもしれません。
実際に「アプリケーション定義 または オブジェクト定義のエラーです。」
と表示され実行できません。
どこから手をつけていいかわからないため、ご教授いただければと思います。
宜しくお願いいたします。

いつもお世話になっております。
現在、データシートから各シートへデータを入力するマクロを作成しようとしています。

ブックの一枚目のシートにデータシートがあり
データシートは以下のようになっています

A   B     C     D     E    F   G
No  社員番号 氏名   所属   日付  数値1 数値2
1 1 123  ○○××  AAA  2016/1  30   20
2 2 123  ○○××  AAA  2016/2  40   15
3 3 123  ○○××  AAA  2016/3  20   90
. .
....続きを読む

Aベストアンサー

No.1です。
コードがコピペできないのでこちらで確認していないのですが

行うことはNo.1で書いたことと同じです。

使用している変数の値を確認する → 問題の行の直前にMsgBoxで表示させて確認する。
その値が適切なパラメータとなっているか確認する
 →Worksheets(j)なら、Msgbox Worksheets(j).Name でシート名を表示させてみるとか

No.1ではループの最初で問題が起こりましたが、今回が何回かループしてから問題が起こるのかもしれませんね。

# VBEには、ステップ動作とか、ウォッチウィンドウとかデバッグ用の機能も搭載されていますので、確認してみて下さい。

QEXCEL2007です。1つのシートから複数のシートに項目ごとに振り分けることはできますか?

EXCEL2007を使用しています。

1つのシートに2008年度の会計をまとめていましたが,それを項目ごとにシートわけをしたいのです。
たとえば
[SHEET1]
月 日 項目  内容    収入   支出   残高
4   10 会費  4月分    10000          10000
4   20 会議  定例会議       5000       5000
4   30 事務費 文具         500       4500
5  10 会費  5月分    10000          14500

となっている場合,会費だったらSHEET2,会議だったらSHEET3に,というようにしていきたいのです。
どのような関数を使用したらできるでしょうか?
どなたかわかる方がいらっしゃいましたら,教えていただきたいと思います。

また,この先のSHEET1に追加していく予定なのですが,それらを自動的に振り分けることはできるでしょうか?

EXCELは基本的な関数(if,sumなど)が使えるようになってきたばかりの初心者です。
よろしくお願いいたします。

EXCEL2007を使用しています。

1つのシートに2008年度の会計をまとめていましたが,それを項目ごとにシートわけをしたいのです。
たとえば
[SHEET1]
月 日 項目  内容    収入   支出   残高
4   10 会費  4月分    10000          10000
4   20 会議  定例会議       5000       5000
4   30 事務費 文具         500       4500
5  10 会費  5月分    10000          14500

となっている場合,会費だ...続きを読む

Aベストアンサー

更に修正:
Sheet2以降のA2セルに
=IF(Sheet1!C2=$A$1,ROW(),"")
下方向コピー
B2セルに
=IF(COUNT($A:$A)<ROW()-1,"",OFFSET(Sheet1!A$1,SMALL($A:$A,ROW()-1)-1,0))
横方向Sheet1のデータがある列+1列までにコピー
そのまま下方向へコピー

今度は短くて分りやすいかな

Qexcelで左のセル項目にあわせた複数選択可能なプルダウンボックスを表

excelで左のセル項目にあわせた複数選択可能なプルダウンボックスを表示させたい。

添付のようなイメージのものを作成したいと考えています。
B列はプルダウンで選べる様になっており、B列の内容により、C列の選択肢を変更
したいのです。
ちなみに、今C列はリストボックスになっていますが、チェックボックスなど、
リストから複数選べるようになれば問題ありません。

このようなものは、VBAなどを組まないとできないのでしょうか。

よろしくお願いいたします。

Aベストアンサー

値を利用することで考えていました。
リストボックスは選んだ表示だけで良くて、
あとはB列のリストボックスの変更に合わせて
リストボックスの項目が変われば良いということですね。

すると、一例としてはこんな感じでしょうか?
セルB2かセルB3の値変更があった場合、
セルの内容(例では魚屋、果物屋、八百屋)に応じて、
リストボックスの内容を変更するマクロです。
設定は下記の通りとしています。
・セルB2、B3はセルE7~E9のリスト選択
・セルB2またはB3の内容に合わせてセルE14~セルG16の
 データをリストに表示する
・2行目にあるリストボックスを“ListBox1”
 3行目にあるリストボックスを“ListBox2”としています。
・リストボックスのListFillRangeは空白にしておく。

以下をVBAで操作を行うシートに貼りつけてみてください。
Excel2002ですが、セルB2を変更すると、リストボックス1の表示内容が
セルB3を変更すると、リストボックス2の表示内容が変わります。
たた、表示内容が変わったときは何も選択していない状態になります。
シートの値を参照していますが、VBA内での記載でもできると思います。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MyRng As Range, isect As Range, i As Long

'セル変更箇所の確認
Set isect = Application.Intersect(Target, Range("B2:B3"))
If isect Is Nothing Then
Exit Sub
End If
'リストボックスの範囲設定
Select Case Target.Value
Case "魚屋"
Set MyRng = ActiveSheet.Range("F14:F16")
Case "八百屋"
Set MyRng = ActiveSheet.Range("E14:E16")
Case "果物屋"
Set MyRng = ActiveSheet.Range("G14:G16")
End Select
'リストボックスの設定
If isect.Address = Range("B2").Address Then
ListBox1.List = MyRng.Value
ElseIf isect.Address = Range("B3").Address Then
ListBox2.List = MyRng.Value
End If
End Sub

値を利用することで考えていました。
リストボックスは選んだ表示だけで良くて、
あとはB列のリストボックスの変更に合わせて
リストボックスの項目が変われば良いということですね。

すると、一例としてはこんな感じでしょうか?
セルB2かセルB3の値変更があった場合、
セルの内容(例では魚屋、果物屋、八百屋)に応じて、
リストボックスの内容を変更するマクロです。
設定は下記の通りとしています。
・セルB2、B3はセルE7~E9のリスト選択
・セルB2またはB3の内容に合わせてセルE14~セルG16の
...続きを読む

Qexcelで左のセル項目にあわせたプルダウンボックスを表示させたい

EXCELで表を作成しておりますが何をつかっていいのか、わからなかったので教えてください!!excelは初心者であまりくわしくないです。

メーカーのセルに複数のメーカー名が記入されていてプルダウンで選べばアイテムの欄にそのメーカーのアイテムがならぶようにしたい。
メーカーのところは、入力規則でプルダウンで項目を選べるようにしています。
たとえばセルDでAというメーカーを選んだらとなりのセルEにはAのメーカー商品群、Bを選んだらBのメーカー商品群という形です。またそのふたつとなりのセル(となりのセルでもいいです)にはvlookupで参照させてそれぞれの商品価格を反映させたいのです


日付お客様名担当メーカーアイテム支払方法税金税抜合計合計金額
2007/3/18かきくけこあああプロビテメイム#VALUE!カード

Aベストアンサー

名前とINDIRECT関数を使うとできます。
たとえば、シートの別の場所か、あるいは他のシートにAのメーカーのアイテム一覧を入力しておき、「挿入>名前>定義」で、「参照範囲」をその一覧の範囲、「名前」をプルダウンで選択するときのAのメーカー名にして「追加」を押します。

他のメーカーも同様にアイテム一覧を作って、プルダウンで選択するときのメーカー名で名前を定義します。

そして、たとえばD1でメーカー名を選択する場合、商品群を入力したいセルの入力規則のリストの「元の値」を
=INDIRECT(D1)
としておけば、D1の内容によってE1のリストの内容が変わります。


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

人気Q&Aランキング

おすすめ情報