-PR-
解決済み

エクセルVBAで、テキストボックスにセルの値を入れる

  • すぐに回答を!
  • 質問No.79173
  • 閲覧数2841
  • ありがとう数7
  • 気になる数0
  • 回答数14
  • コメント数0

お礼率 59% (116/195)

宜しくお願いします。

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

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

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

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

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

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

以上、条件が多くてすみませんが、VBAは初心者で、ほんの部分的にしかまだ分かりません。どなたか詳しい方宜しくお願いします。
通報する
  • 回答数14
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.14
レベル13

ベストアンサー率 68% (791/1163)

前回の解答はプレビューで確認し、プレビュー画面の印刷ボタンを押せば印刷しますが、プレビュー画面を表示しないで直接印刷する場合は、単票印刷の書式覚えておく必要があります。
下記の修正は、印刷時にどのパターンの単票が必要かを知らせます。メッセージ表示のタイミングは、特定の印刷パターンを指定した時は印刷時最初のみ、全パターン指定時は各データ印刷毎です。特定の印刷パターンを指定すれば用紙をまとめてセットできるので実務的と思われます。

●**** 追加 **** と書いた範囲を追加、**** 修正 **** の1行を修正
Public Sub page_Print(sPatt, iPatt As Integer) '**** 修正 ****
'**** 追加 **** ↓
Dim myMsg As String 'メセージ
If iPatt = 0 Then
myMsg = (Worksheets("Sheet1").Range("B5") - 1) & " 行目" & vbLf
myMsg = myMsg & "印刷パターン " & StrConv(sPatt, vbWide) & " を印刷します。" & vbLf
myMsg = myMsg & "  用紙をセットしてください。" & vbLf & vbLf
myMsg = myMsg & "(印刷しない場合はキャンセルを押します。)" & vbLf & vbLf
If MsgBox(myMsg, vbOKCancel) = vbCancel Then
Exit Sub
End If
End If
'**** 追加 **** ↑

Range("Print_Area").Select: Selection.Font.ColorIndex = 2
ActiveWindow.SelectedSheets.PrintPreview 'PrintOut
Selection.Font.ColorIndex = xlAutomatic
Range("Print_Area").Cells(1, 1).Select

End Sub

●**** 追加 **** と書いた範囲を追加、**** 修正 **** の1行を修正
Public Sub job_Print() '指定して連続印刷

Application.ScreenUpdating = False
'**** 追加 **** ↓
If prtPattern <> 0 Then
myMsg = "印刷パターン " & StrConv(prtPattern, vbWide) & " を印刷します。" & vbLf
myMsg = myMsg & "  用紙を複数枚セットしてください。"
MsgBox myMsg, vbOKOnly
End If
'**** 追加 **** ↑
For rowCot = startRow To endRow '連続ページ印刷
Tensou rowCot, prtPattern
If prtPattern = 0 Or (prtPattern = shtPatt) Then '印刷パターンを判定
page_Print shtPatt, prtPattern '**** 修正 ****
End If
Next
Application.ScreenUpdating = True
Worksheets("Sheet7").Activate
End Sub

●**** 修正 ****の1行を修正(5シート同様に修正)
Private Sub CommandButton2_Click() 'シート単位の1ページ印刷ボタン
page_Print Right(ActiveSheet.Name, 1), 0 '**** 修正 ****
End Sub
補足コメント
rurucom

お礼率 59% (116/195)

nishi6さん!ありがとうございます。早速、やってみます!明日にでも結果ご連絡します。
投稿日時 - 2001-06-03 22:46:02
お礼コメント
rurucom

お礼率 59% (116/195)

nishi6さん、長い間ありがとうございました。何と素晴らしいものになりつつあります。
あと、何点か質問があるのですが・・・補足を書く事が出来なくなってしまったので、質問にエクセルVBAで、テキストボックスにセルの値を入れる(2)で新たに質問させていただきますので、宜しくお願いします。
投稿日時 - 2001-06-04 19:19:27
関連するQ&A
-PR-
-PR-

その他の回答 (全13件)

  • 回答No.9
レベル12

ベストアンサー率 52% (206/389)

No.3の補足での問題を要約すると (1)データが4桁の数値で、それぞれの桁ごとにテキストボックスに数値を表示した い。 (2)データ数(行数)の増減に対応したい。(数値の無い所ではエラーとなる) (3)計算にかかる時間を減らしたい。 ということでしょうか。 (1)については、すでにMIDワークシート関数で試されているようでが、これとINDEX関数を組み合わせれば、当該回答で述べた応用が利 ...続きを読む
No.3の補足での問題を要約すると
(1)データが4桁の数値で、それぞれの桁ごとにテキストボックスに数値を表示した
い。
(2)データ数(行数)の増減に対応したい。(数値の無い所ではエラーとなる)
(3)計算にかかる時間を減らしたい。
ということでしょうか。

(1)については、すでにMIDワークシート関数で試されているようでが、これとINDEX関数を組み合わせれば、当該回答で述べた応用が利くと思います。A列の2~500行目までの4桁数値のデータがあり、B1に行番号(インデックス値)があるとするならば、
=MID(INDEX($A2:$A500,$B$1),X,1)
ですね。X=1で1桁目、X=2で2桁目~X=4で4桁目を表示します。
(2)INDEX関数で指定するデータ範囲を多めにしておいて、"#REF!"エラーになったら表示しない方法と、(スピン)ボタンの最大値をVBAで入れる方法があります。
=IF(ISERR(Y)=TRUE,"",Y)
この例ではYが"#REF!"ならば空白になります。
スピンボタンの最大値をVBAで固定する場合、X列目のデータが何行目まであるかを取得するには、
Range(.Cells(Rows.Count, X).End(xlUp).Address).Row
を使ってはいかがでしょう?
(3)計算時間が長くなるということは、リンク付きのテキストボックスの数が結構多いんじゃないですか?。オプションで計算を手動にすると、いちいち計算のたびに作業が止まらなくて済みますが、得策ではないかもしれません。やはり、セルを調整していった方がいいのかもしれませんが、印刷時の位置ズレに関しては、EXCELはあまり向いていないのかもしれませんね。
・・・なんか、以前私が直面してきたことと同じ道を歩んでいらっしゃるようです(^^;)。がんばってください。私の所は、伝票印刷用のソフトを入れました。
お礼コメント
rurucom

お礼率 59% (116/195)

TTakさん!ありがとうございました。
なるほど!INDEX関数だったんですね!ほんとにありがとうございました。
投稿日時 - 2001-05-28 19:42:30


  • 回答No.4
レベル13

ベストアンサー率 68% (791/1163)

私は同様のケースではVBのツールボックスのコントロールを使っています。 一回、テキストボックスのLinkedCellに設定すればコードが不要になりますし、 元データの加工・変換、演算等がセル上で解決できるからです。(図形も同じ?) ということで、以下はツールボックスのテキストボックスを使用しています。参考にして下さい。 下記VBAは図形でも同じ理屈で動くはずです。 テキストボックスに表示 ...続きを読む
私は同様のケースでは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
補足コメント
rurucom

お礼率 59% (116/195)

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

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

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

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

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

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

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

前回質問させていただいて以来、プログラムが動いたことに感動して、はじめてのVBAプログラミングと言いう本を見ながら勉強しています。少しずつ分かってくるようにはなってきましたがまだまだです!早く出来るようになりたいと気ばかりが前へいって・・・でも実務は目の前だし・・・って感じで頑張ってます。
何卒宜しくお願いします。
投稿日時 - 2001-05-22 20:20:27
  • 回答No.5
レベル13

ベストアンサー率 68% (791/1163)

>この辺でも何かアドバイスがありましたらよろしくお願いします。 思いつくままに・・・・(よく同じようなことをしているもので) 1.用紙換えが大変でしょうからデータを事前にパターンでソートしておいたらどうでしょう。 2.VBのテキストボックスで AutoSize が使えるかもしれません。 3.微調整の意味がデータの長さに起因するものなら、2行目にデータを持ってきたら、3行目で例えばA3:=RIGH ...続きを読む
>この辺でも何かアドバイスがありましたらよろしくお願いします。
思いつくままに・・・・(よく同じようなことをしているもので)
1.用紙換えが大変でしょうからデータを事前にパターンでソートしておいたらどうでしょう。
2.VBのテキストボックスで AutoSize が使えるかもしれません。
3.微調整の意味がデータの長さに起因するものなら、2行目にデータを持ってきたら、3行目で例えばA3:=RIGHT(REPT(" ",10)&A2,10) と10桁に揃えてしまえば修正は少なくなるかもしれません。
カンマ付で10桁にするならA3:=RIGHT(REPT(" ",10) & TEXT(A2,"#,#"),10) とか。そしてA3をテキストボックスに表示します。微調整を極力少なくする(なくす)つくりが必要でしょう。
それに、フォントはプロポーショナルは使わないほうがいいかもしれませんね。

>それと、補足で質問ですが・・・
標準モジュールにユーザー定義関数を定義したらどうでしょうか。
下は(A,B)、(B,C)、(C,D)、(A,C)、(A,D)の列のセットで入力があればパターンを返しています。条件が合うように変更してください。
例えば、E列に =Hantei(row()) と設定します。自動再計算します。

Public Function Hantei(rowNo As Long)
Application.Volatile
Select Case True
Case Range("A" & rowNo) <> "" And Range("B" & rowNo) <> ""
Hantei = 1
Case Range("B" & rowNo) <> "" And Range("C" & rowNo) <> ""
Hantei = 2
Case Range("C" & rowNo) <> "" And Range("D" & rowNo) <> ""
Hantei = 3
Case Range("A" & rowNo) <> "" And Range("C" & rowNo) <> ""
Hantei = 4
Case Range("A" & rowNo) <> "" And Range("D" & rowNo) <> ""
Hantei = 5
End Select
End Function

>印刷する場合は、テキストボックス内の文字のみ印刷(シートには印刷したくない文字書きたいので・・・)
にはまだ回答してませんでした。

Workbook_BeforePrint を使って、セルの色を変えて印刷して戻せばいいと思ったのですが、印刷した後、元に戻すイベントを見つけられませんでした。苦し紛れにボタン(Caption=印刷)を追加しました。
Sheet1~Sheet5にボタン(VBのデス)を追加します。ダブルクリックして、
Private Sub CommandButton2_Click()
Range("Print_Area").Font.ColorIndex = 2 '2で白くなるハズ
ActiveWindow.SelectedSheets.PrintPreview '今は画面表示
'ActiveWindow.SelectedSheets.PrintOut
Range("Print_Area").Font.ColorIndex = xlAutomatic '黒になるハズ
End Sub
とします。5シートとも同じコードです。
各シートには印刷範囲を設定しておいてください。
それから#4の回答はデータの入ったシートと印刷用のシートが共に開いていることを想定しています。

結局、どのようなコントロールを使用するかは問題ではなく、データをそれに見合ったシートに渡し、印刷時にセル色を制御する問題だったようです。
長くなりました。では。。。
補足コメント
rurucom

お礼率 59% (116/195)

nishi6さん!度々すみません!

パターンを返すVBAはテストデータでは、うまく動きました。ところが・・・
私の補足説明不足のせいでしょうが・・・
A・B・C)のように3つ列にデータがある場合がうまくいきません2つまでしかだめなんですか?

それから、=Hantei(Row())をE列に設定をデータ行数に合わせて自動的に、返してくれる方法はありませんか?

それと、#4の回答で教えていただいたVBAが、インデックスが見当たりませんのエラーで、デバックにすると、With Workbook(WbNM).~の行で止まります。
どうしてでしょうか?
LinkedCellのセル番地をセットが良く分かりませんでしたどとりあえずA1と入れました。このせいですかねー?


いろいろとすみません。またまた宜しくお願いします。
投稿日時 - 2001-05-23 18:58:23
  • 回答No.10
レベル13

ベストアンサー率 68% (791/1163)

>問題は、OKWEBが漏れていた事と・・・・ 少し誤解があるようなので説明します。「OKWEB_Data.xls」は私が作った勝手なファイル名ですのでrurucomさんが作られたファイル名をこの名前にする必要はありません。逆にマクロ内の「OKWEB_Data.xls」をrurucomさん使用のファイル名に変えてくださいという意味でした。それはさておき(動いたということで) >=Hantei(Row ...続きを読む
>問題は、OKWEBが漏れていた事と・・・・
少し誤解があるようなので説明します。「OKWEB_Data.xls」は私が作った勝手なファイル名ですのでrurucomさんが作られたファイル名をこの名前にする必要はありません。逆にマクロ内の「OKWEB_Data.xls」をrurucomさん使用のファイル名に変えてくださいという意味でした。それはさておき(動いたということで)

>=Hantei(Row())をE列に設定をデータ行数に合わせて自動的に、返してくれる方法はありませんか

に対するア)の方法ですが、判定条件さえ確実ならデータシートの方に手を加えることは必要ないと思います。行を指定したときに、パターンを判定すれば済むことで、下記の修正を加えれば大丈夫でしょう。

ユーザー定義関数を少し変えます。標準モジュールにあることが必要です。2行を追加します。
Hantei = 5
Case Else '***追加*** パターンに合わない場合、データが無くなった場合
Hantei = 0 '***追加***
End Select

#4に書いたモジュールを少し変えます。
st = .Offset(tensouNo, pattIdx - 1): If st = 0 Then Exit Sub 'パターンを調べる
   ↓
st = Hantei(tensouNo): If st = 0 Then Exit Sub 'パターンを調べる
都合3箇所の修正です。

 1)どこかの印刷用シートの<B5に印刷行を入力>(未入力なら1)
 2)<ボタン1を押す>
 3)パターンを判定して該当のシートを表示、データを2行目に転送
 4)<テキストボックスの微調整>
 5)<印刷ボタンを押す。>シートの文字を見えなくして印刷。
 6)印刷が終わればシートの文字を可視に
 7)繰り返し   の手順になるはずです。< >は人の操作です。
テスト用に作ったシートを消してしまいました。想像だけで書いていますので不具合があれば教えてください。
補足コメント
rurucom

お礼率 59% (116/195)

nishi6さん!ほんとに何度もすみません!
私は、どうやら勘違いしていたような・・・

Public Function Hantei(rowNo As Long)
Application.Volatile
Select Case True
Case Range("A" & rowNo) <> "" And Range("B" & rowNo) <> ""
Hantei = 1
↓ここからここまで
Case Range("A" & rowNo) <> "" And Range("B" & rowNo) <> "" And Range("C" & rowNo) <> ""
Hantei = 5
Case Else
Hantei = 0
End Select
End Function

上記のコードをデータシートのモジュールに書いていたんですが、操作する側のファイル(回答4を書いているファイル)に書かないといけないんですよね???

それしたら、どこに書いて良いか分からなくなってきたのですが・・・

ほんっ・・とに何度もすみません。どこに書いたら良いか教えてください。
投稿日時 - 2001-05-28 19:43:15
  • 回答No.1
レベル13

ベストアンサー率 46% (643/1383)

ワークシート上にテキストボックス(TB1)とコマンドボタン(CB1)を配置して、以下のようにコードを書きます。 (ただし、テキストボックスは、図形描画ツールバーのものではなく、コントロールツールボックスのものを使います。) Private Sub CB1_Click() Me.TB1 = Range("A1") 'A1の中身をテキストボックスに転送する ...続きを読む
ワークシート上にテキストボックス(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

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

不明点とかあったら、補足してください。
補足コメント
rurucom

お礼率 59% (116/195)

すみません! やってみましたが、さっぱり分かりませんでした。すみませんが、詳しく教えていただきたいのですが、宜しくお願いします。
投稿日時 - 2001-05-22 07:50:45
  • 回答No.2
レベル12

ベストアンサー率 52% (206/389)

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

お礼率 59% (116/195)

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

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

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

説明不足ですみませんでした!よろしくお願いします。
投稿日時 - 2001-05-22 12:45:10
  • 回答No.3
レベル12

ベストアンサー率 52% (206/389)

VBAは最後の手段にしましょう。VBAを使わない方法を要旨だけ書きます。 例として、データシートをSheet1、印刷シートをSheet2とします。 (1)---テキストボックスに別のシートの値を入れる テキストボックスをアクティブにして、数式バーに参照元を入れると、テキストボックスにはその値が表示されます。これを利用すれば、VBAなしでセルの値をテキストボックスに反映できます。もちろんフォントや ...続きを読む
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のデータを返すはずです。

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

お礼率 59% (116/195)

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

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

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

と言う事で、この辺について教えてください。宜しくお願いします。
投稿日時 - 2001-05-23 19:16:04
お礼コメント
rurucom

お礼率 59% (116/195)

TTakさん!ありがとうございます。早速やってみました。うまく動いてます。
すごいですね! VBAでなくてもこんなことが出来るんですね!あとは頑張って考えます。
投稿日時 - 2001-05-22 19:57:40
  • 回答No.6
レベル13

ベストアンサー率 46% (643/1383)

>すみませんが、詳しく教えていただきたいのですが、宜しくお願いします。 #1の回答は忘れてください(汗)。もっとよさそうなやり方を考え付きました。 複数の帳票を使うということですので、ワークシートを複数用意することにしましょう。 とりあえず、Sheet1にデータが入力されていて、使用する帳票が3つ。それぞれSheet2,Sheet3,Sheet4にレイアウトを作成することとします。 ...続きを読む
>すみませんが、詳しく教えていただきたいのですが、宜しくお願いします。

#1の回答は忘れてください(汗)。もっとよさそうなやり方を考え付きました。

複数の帳票を使うということですので、ワークシートを複数用意することにしましょう。
とりあえず、Sheet1にデータが入力されていて、使用する帳票が3つ。それぞれSheet2,Sheet3,Sheet4にレイアウトを作成することとします。
また、Sheet5を作業用に使用するものとします。

●まず、任意の列のデータのみを取り出す処理を作成します。
1:Sheet5!A1のセルに「2」と入力
2:Sheet5!A2に「=INDIRECT("Sheet1!A" & $A$1)」(このセルに、Sheet1!A2のセルの内容が取り出せたはずです。)
3:同様に、Sheet5!B2に「=INDIRECT("Sheet1!B" & $A$1)」と入力。これを必要な列の数だけ繰り返す。
(Sheet5!A1の数値を変更すれば、その行のデータが取り出せるはずです。)


●取り出したデータをもとに、帳票のイメージを作成します。
4:Sheet2にテキストボックスを配置して、数式編集欄に「=Sheet5!A2」と入力(テキストボックスにSheet5!A2の内容が表示される)
5:テキストボックスをもう一つ作成し、数式編集欄に「=Sheet5!B2」と入力。これを列の数だけ繰り返す。
6:大まかな帳票の体裁に整える。

●他の帳票のイメージも作成。
6:Sheet5!A1 に行番号を数値で入力し、帳票2のデータを表示させる。
7:Sheet3にもテキストボックスを貼り付ける。数式編集欄に「=Sheet5!A2」と入力。同じ操作を列の数だけ。Sheet2をコピーすれば楽チンかも。
8:Sheet4も同様。

●ユーザーインターフェースの作成(印刷ボタン1コ)
9:[表示]-[ツールバー]-[コントロールツールボックス]
10:Sheet1を選択して、「コマンドボタン」のパーツを配置する。
11:配置したボタンをマウスで選択
12:「コントロールツールボックス」の「プロパティ」をクリック
13:[(オブジェクト名)]の項目を「印刷ボタン」に設定する。
14:[Caption]の項目を、「印刷開始」に設定する。

●ボタンを押したときの処理をVBAで記述する。
15:ボタンをダブルクリック。(VBAの編集画面が登場)
16:後述のコードを記述する。

●実行!!
17:「コントロールツールボックス」の三角定規のアイコンをクリック。
18:「印刷開始」ボタンをクリック。
  • 回答No.7
レベル13

ベストアンサー率 46% (643/1383)

Private Sub 印刷ボタン_Click()   Dim DataRange As Range   Dim RNG As Range   Dim RowNo As Long   Dim TargetSheetName As String   Dim OTargetSheetName As String   Dim ExitFlag As Boolean      Const Crit ...続きを読む
Private Sub 印刷ボタン_Click()
  Dim DataRange As Range
  Dim RNG As Range
  Dim RowNo As Long
  Dim TargetSheetName As String
  Dim OTargetSheetName As String
  Dim ExitFlag As Boolean
  
  Const CriteriaColumn = "B" '帳票を判別するためのキーとなる列を設定します。
  '例えば、"B"を設定すれば、B列の内容に応じて帳票を切り替えます。
  
  Set DataRange = Range("A2..Z65536") 'データが入力されている範囲を設定します。
  
  For Each RNG In DataRange.Rows
    RowNo = RNG.Row
    Select Case Range(CriteriaColumn & RowNo)
      Case 1 'B列の値が1ならば、Sheet2の帳票を印刷する。
        TargetSheetName = "Sheet2"
      Case 2
        TargetSheetName = "Sheet3"
      Case 3
        TargetSheetName = "Sheet4"
      Case "" 'B列が空白ならば、そこで処理を中止する。
        ExitFlag = True
        TargetSheetName = ""
      Case Else
        MsgBox "印刷する帳票が識別できませんでした。(" & RowNo & "行目)"
        TargetSheetName = ""
    End Select
        
    'エラーチェック
    If TargetSheetName = "" Then GoTo NextRow
    
    
    '用紙の準備
    If OTargetSheetName <> TargetSheetName Then
      MsgBox "プリンタに用紙 (" & TargetSheetName & ")をセットしてください。" & vbNewLine _
      & "準備が出来たら[OK]をクリックしてください。"
    End If
    
    '印刷
    Worksheets("Sheet5").Range("A1") = RowNo
    Worksheets(TargetSheetName).Calculate
    Worksheets(TargetSheetName).PrintOut
NextRow:
    If ExitFlag Then
      Exit For
    End If
  Next
  MsgBox "終わり!"
  
End Sub
補足コメント
rurucom

お礼率 59% (116/195)

ARCさん!ありがとうございます。うまく動きました!!
このVBAは、一括印刷をさせるボタンとして使わせていただきます。

ところが、現在、各シートを表示させながら1枚ずつ印刷させるVBAのコーディングで悪戦苦闘中で、この辺のところについて教えていただけませんでしょうか?

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

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

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


宜しくお願いします。
投稿日時 - 2001-05-23 18:40:39
  • 回答No.8
レベル13

ベストアンサー率 68% (791/1163)

>A・B・C)のように3つ列にデータがある場合がうまくいきません・・・ 3個の場合も同様と思って分けなかったんですが、 Case Range("A" & rowNo) <> "" And Range("B" & rowNo) <> "" And Range("C" ...続きを読む
>A・B・C)のように3つ列にデータがある場合がうまくいきません・・・
3個の場合も同様と思って分けなかったんですが、
Case Range("A" & rowNo) <> "" And Range("B" & rowNo) <> "" And Range("C" & rowNo) <> ""
のように書きますが、最初に(A,B)で判定して、次に(A,B,C)で判定すると、集合論的に言うと(A,B)⊃(A,B,C)となっているため、望む答えが得られないことになります。各判定(Caseの後ろの式)を独立にすることが大事です。(A,B)はC列に入力されていないことなら And Range("C" & rowNo) = "" を追加します。

>#4の回答で教えていただいたVBAが、インデックスが見当たりませんのエラー
Public Const wbNM = "OKWEB_Data.xls" をご自分のブック名にされました?
Public Const wsNM = "Sheet1" をデータがあるシート名にされたでしょうか。
私は、1つのExcelに2のブックを開いて確認しました。同様にしてもらえませんか。またスペルミスの可能性はありませんか。OKWebをコピーされましたか。やはり見えないといろいろ起きますね。

>LinkedCellのセル番地をセットが良く分かりませんでした
そのテキストボックスに表示したいセル番地をセットします。#4では2行目にデータを出力していましたので、A2とかB2になります。

>=Hantei(Row())をE列に設定をデータ行数に合わせて自動的に、返してくれる方法はありませんか?
「データ行数に合わせて自動的に、返してくれる」の意味が良くわかりませんが、何かのキッカケでE列にこの式が自動的にセットされるということでしょうか。
ア)AからDまでのどこかに入力されたらE列に式をセットして評価
イ)AからDまで何件も入力しておいてマクロを実行して一括セット(コピー)
他にも考えられますし補足して下さい。ア)、イ)は可能です。
補足コメント
rurucom

お礼率 59% (116/195)

nishi6さん!うごきました!くだらない質問をしてしまいすみません!
問題は、OKWEBが漏れていた事と、次に(A,B,C)で判定すると、集合論的に言うと(A,B)⊃(A,B,C)となっていたためでした。

>「データ行数に合わせて自動的に、返してくれる」の意味が良くわかりませんが
の件ですが・・・説明が悪くてすみません!
ァ)の方がいいように思うのですが・・・
データファイルの行数がどれぐらいになるかがその時々で変わってくるのです。私自身がこの作業を常にやっていれば問題ないのですが、いろんな人(ド素人)が作業を変わりばんこにしますので、自動的に認識させたいのです。

できれば、データファイルの方にプログラムを記述するのではなく、フォームのあるファイルの方で実行させたいのですが、出来ますか?
なぜかというと・・・
データファイルにコーディングしたりSheet1のE列に数式を入れておくと別のデータに変わったプログラミングしなければならない。というのをなくしたいのです。
既存のデータの数多くあるので・・・
投稿日時 - 2001-05-25 18:48:18
13件中 1~10件目を表示
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ