プロが教える店舗&オフィスのセキュリティ対策術

質問がバラバラになってしまってすみません!
エクセルVBAで、テキストボックスに値を入れる(1)の 回答13で、
データシートの何行目~何行目までを印刷させる方法(Sheet7にボタン)
をさせるには、どうしたら良いでしょうか?宜しくお願いします。

前回のURL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=79173
      http://oshiete1.goo.ne.jp/kotaeru.php3?qid=85389

A 回答 (11件中1~10件)

シート7にボタンを1つ作成します。

VBAのコントロールツールボックス(トンカチとスパナみたいなアイコン)のコマンドボタンです。

コマンドボタンをダブルクリックして、VBE画面のシート7のシートモジュールに
下記を貼り付けます。13の回答ではCommandButton1が複数表れるので、3番目のボタンの意味でCommandButton3と書いてしまいました。シート7にコマンドボタン1個の場合はCommandButton1となるはずなので job_Print を書けばおしまいです。

====印刷シート7のシートモジュールに貼り付け=====
Private Sub CommandButton1_Click()
job_Print
End Sub

この回答への補足

説明不足ですみませんでした。

パターン毎に印刷する場合と、データの行を範囲指定して印刷する場合とを別々にしたかったのです。現在のボタンは残したままでいいのですが、別にパターンを無視した行の指定をさせたたかったのです。

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

補足日時:2001/06/05 19:04
    • good
    • 0

シート7のボタンの機能は、このボタンだけで



 1.パターンの入力
   0ならパターン無視(全パターンが印刷対象)
   1~5ならそのパターンを印刷
 2.開始行の入力
   0なら全行
   1以上ならそれが開始行
 3.開始行が1以上なら最終行の入力
   0なら最終行を自動設定
   1以上ならそれが最終行
の手順とすることで、全パターンまたは指定パターンについて、全頁または指定頁間が印刷可能なように考えました。

したがって、
>パターン毎に印刷する場合
  <<パターンの入力=1、2、3、4または5、開始行の入力=0>>
    指定したパターンの全行が対象です。当然、指定パターンの開始、最終行
    の入力もできます。

>データの行を範囲指定して印刷する場合
  M行目からN行目の場合、
  <<パターンの入力=0、開始行=M、最終行=N>>
    パターンは全パターンになっているので、M行からN行が対象になります。
    蛇足ですが、パターンの入力=0、開始行=0で全データの印刷になります。

説明不足でしたか。

この回答への補足

あいやーすみません!実は、このプログラムを別の似たような処理に使おうと思って質問したので、パターンの選択はいらなっかたのです。すみません!でも、最初のインプットボックスのコードを消してとりあえず解決しました。大丈夫ですよね?ちゃんと動いてますし!

ところで、本体の方の完成度はかなり高くなってきました。感謝感激です!といってもまだ、テストデータのテスト用の本体ですが・・・ほんとにありがとうございます。そこで疑問があるのですが、Hanteiの理屈を教えていただきたいのですが・・・というのが、実際のデータでは、テストデータより列数が多くて、しかもデータのあるセルとないセルがいろいろあるのですが、A列、B列、C列、を判定させただけでうまくいくのかが、心配です。差し支えなければ、理屈を教えてください。現在、実際のデータにあわせて作っている最中ですが、まだまだかかりそうなのでよろしくお願いします。

そろそろ、最後の質問になってくると思いますが・・・あといくつかお願いします。やればやるほど欲が出てきてしまってすみません!
いろいろ付け加えているのですが、下記の内容の処理がわかりません!

1)検索ボタン~Sheet7に配置~
ボタンを押すことで、インプットボックスが開きそこに入力された文字や数字を列Bから検索させて、該当データを印刷フォームを表示する。

2)終了ボタン~Sheet7に配置~
終了ボタンを押すことで、データシートを「上書き保存」してデータシートとフォームのシートを閉じる。
もし、「×」で閉じようとしたら、エラーメッセージ、終了ボタンをクリックしてから終了させてください!と表示させる。

3)前回の続きから始める~Sheet7に配置~
ゲームで言うコンティニューみたいなもので・・・前回最後に印刷させた行を表示させるボタン。
※Sheet7は、メインメニューとして使っています。

その他、こんなものを付け加えました。nishi6先生からおこられるかなぁ?一応動いてくれてます。ご指摘がありましたらよろしくお願いします。
(1)*******
Private Sub CommandButton3_Click() '先頭行の表示ボタン
Range("B5") = 1
Tensou Range("B5") - (Range("B5") = 0), 0
End Sub
(2)*******
Private Sub CommandButton4_Click() '1行前を表示
Range("B5") = Range("B6") 'B6のセルに"=B5-2"を入れました。
Tensou Range("B5") - (Range("B5") = 0), 0
End Sub
(3)*******
Private Sub CommandButton2_Click()’任意で行を指定して表示させました。
Dim tiMsg As String 'メッセージ
Dim tiNum 'インプット帰り値
Dim StRow As Long '表示する行
tiMsg = "最初に表示させたい行を入力" & vbLf
tiNum = InputBox(tiMsg)
Range("B5") = tiNum - 1
Tensou Range("B5") - (Range("B5") = 0), 0
End Sub
(4)******
Private Sub CommandButton4_Click()
 ’データシートを表示させるボタンをSheet7につけました。
Workbooks.Open "データ.xls"
Worksheets("Sheet1").Activate
 ※ここで本当は、データの左上を表示させたかったのですが出来ませんでした。
End Sub
(5)******
Private Sub Workbook_Open()’ThisWorkBookにコーディング 
’本体を開くとデータシートも開くようにしました。
Workbooks.Open ("データ.xls")
Worksheets("Sheet7").Activate
MsgBox ("ようこそ")
End Sub
あとは、ヘルプ機能を付けていきたいと思っています。ヘルプと言ってもワードかメモ帳にでも項目毎にちょこっと書いて、それを見に行くようにするだけですけど・・・この辺は、がんばって出来そうです。
長くなりましたが、よろしくお願いします。

補足日時:2001/06/06 22:57
    • good
    • 0

Select Case の使い方の質問のように思えましたが、違ってる?



Select Caseの使い方に関しては(よく本に書いてあるのが)
  Select Case Atai
    Case 1: Kekka = "結果A"
    Case 2: Kekka = "結果B"
     ↓
    Case 9: Kekka = "結果Z"
  End Select
という風に、Ataiという変数が1,2,・・9に従ってKekkaという変数に"結果A"、"結果B"、・・・が入るというように使います。ここで大事なのは、1回の判定ではAtaiは1~9の1つの値しかとらないということです。
Hanteiでの使い方は少し違っていて、
  Select Case True
    Case Atai = 1: Kekka="結果A"
    Case Atai = 2: Kekka="結果B"
     ↓
    Case Atai = 9: Kekka="結果Z"
  End Select
としています。各Caseの次の式がTrue(正しい)だったら対応した値がKekkaに入ります。この使い方でも上記と同様に各Caseの次の式が同時にTrueになったら判定がおかしくなります。<Atai = 1>という式は、If Atai = 1 Then で使うように、論理式です。論理式ですから、X=1 And Y=1 AND Z=1 のような使い方ができます。Ifを使うより分かり易い(かな)と思って使いました。

まずい例を上げると、Atai1、Atai2(両者とも0または1とします)で判定する場合、
  Case Atai1 = 1
  Case Atai1 = 1 And Atai2 = 1
と書くと、最初の判定でAtai2がどうであれ処理されて、2つ目の式の評価がされないことになります。式の順番を逆にすればうまくいきます。VBAは上から下に順に処理していくためです。
従って、判定がどう複雑になっても、Caseの次の式がそれぞれ独立ならば正しく判定されます。

しかし、入力は人間が行ったりするのでミスはつきものです。
 (1)各パターンの判定はそれぞれが独立になるように充分検討して設定する
     まずい例のようになっていないか検証する必要があります。
 (2)入力ミスに備えて、各パターンに該当しなかったデータについても対応する
ことが必要でしょう。(2)については、パターンの判定の最後に、
  Case Else: MsgBox "パターン判定エラー"
というようにエラー対応し処理を中断できるようにするべきでしょう。

質問の1)、2)、3)については、暫くお待ちを。
自分で改良できるのは、分かってきた証拠でしょう。頑張って下さい。

この回答への補足

ありがとうございます。納得しました。多分!?・・・・・
対象の列にデータがあるかないかだけを認識しているわけですね!問題は、順序と言う事ですね!

質問の1)、2)、3)の件は、今日もいろいろ試してみましたが、やはりまだ出来ませんでした。はぁ・・・私は、まだまだですね!

宜しく、お願いします。

補足日時:2001/06/07 18:08
    • good
    • 0

>2)終了ボタン~Sheet7に配置~


ここでは、メニュー(終了できる方)を「OkWeb_Menu.xls」
データシートを「OkWeb_Data.xls」とします。(ご自分のファイル名に変えてください)
  1.タイトルバーの左のアイコンのクリック、
  2.タイトルバーの右クリック
  3.タイトルバーの×ボタン、
  4.メニュー→閉じる、
  5.ブックの× では閉じれなくする

データシートのThisWorkBookのシートモジュールに貼り付けます。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Workbooks("OkWeb_Menu.xls").saveOk = False Then
MsgBox "メニューから終了させてください!", vbOKOnly
Cancel = True
Else
ActiveWorkbook.Save
End If
End Sub

メニュー(終了できる方)のThisWorkBookのシートモジュールに貼り付けます。
Public saveOk As Boolean '終了ボタンでTrue

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If saveOk = False Then
MsgBox "終了ボタンをクリックしてから終了させてください!", vbOKOnly
Cancel = True
Else
Cancel = False
End If
End Sub

メニューの終了ボタンがあるシートのシートモジュールに貼り付けます。
Private Sub cmdSyuryo_Click()
Dim myMsg As String
myMsg = "データシートとフォームのシートを保存して終了します。"
If MsgBox(myMsg, vbOKCancel, "確認") = vbCancel Then
Exit Sub
End If
Workbooks("OkWeb_Menu.xls").saveOk = True
Workbooks("OkWeb_Data.xls").Close saveChanges:=True
ActiveWorkbook.Save
Application.Quit
End Sub

仮のファイルかコピーを作って試してください。一旦保存しないと効力を発揮しません。
データシートを単独に保存できなくするのは簡単ですが、メニューから保存指示すると、データシートの保存不可機能が働いて、データシートが保存できなくなるため、メニューからの指示ならOKという条件付にするのにブック間のモジュールレベルの変数の参照が可能か調べていました。結果はいたって単純でした。勉強になりました。

>3)前回の続きから始める~Sheet7に配置~
これは、メニューを保存(上の2)したので(すれば)、ご自分で作られた「1行前を表示」ボタンか次のデータを表示すれば自然に表示されます。

>1)検索ボタン~Sheet7に配置~
これはB列に同じ値があるんですよね。(連続検索)
明日にでも・・・(窓が全部閉じてるかと思いました。ここは明けておいて下さい)
    • good
    • 0
この回答へのお礼

ありがとうございました。ばっちりです!

お礼日時:2001/06/14 20:49

>1)検索ボタン~Sheet7に配置~



標準モジュールの最初(Publicがある場所、Public Sub・・・ の前)に貼り付け
Public strAdr, endAdr As String '検索開始、最終アドレス
Public mySearch As String '検索文字

標準モジュールに貼り付け
'*** 検索 ***
Public Sub Kensaku()
Dim wbAcv As String 'メニューブック名
Dim wsDat As Worksheet 'データシート名
Dim foundCell As Range '検索結果
Const topAdr = "$B$1" '検索開始位置

wbAcv = ActiveWorkbook.Name
Set wsDat = Workbooks(wbNM).Worksheets(wsNM)
If Len(strAdr) = 0 Then strAdr = topAdr
endAdr = Left(topAdr, 2) & "$" & wsDat.UsedRange.Rows.Count
If Len(mySearch) <> 0 Then
If MsgBox("継続しますか?(新規はキャンセル)", vbOKCancel, "継続") = vbCancel Then
mySearch = InputBox("検索文字を入力して下さい。"): If Len(mySearch) = 0 Then Exit Sub
strAdr = topAdr
End If
Else
mySearch = InputBox("検索文字を入力して下さい。"): If Len(mySearch) = 0 Then Exit Sub
strAdr = topAdr
End If
Application.ScreenUpdating = False
wsDat.Activate: wsDat.Range(strAdr & ":" & endAdr).Select '検索範囲
Set foundCell = Selection.Find(mySearch) '検索実行
Workbooks(wbAcv).Worksheets("Sheet7").Activate
If foundCell Is Nothing Then '検索文字無し
strAdr = topAdr: MsgBox "検索文字:" & mySearch & "は見つかりません。"
ElseIf foundCell.Address = strAdr Then '全検索終了
strAdr = topAdr: MsgBox "検索は終了しました。"
Else '検索文字発見
MsgBox "検索文字:" & mySearch & "は " & StrConv((foundCell.Row - 1), vbWide) & "行目 です。"
strAdr = foundCell.Address
Tensou foundCell.Row - 1, 0 '対象シートを表示
End If
Application.ScreenUpdating = True
End Sub

シート7のシートモジュールに貼り付け。検索ボタンのオブジェクト名=cmdKensaku
Private Sub cmdKensaku_Click()
Kensaku
End Sub

連続して検索できるはずです。

この回答への補足

お返事が遅れてすみません!
これも完璧です!検索の処理(連続検索)に感動しました。かなり実用的です。
予想以上のもので、本当にありがとうございます。

それと・・・またもや新たな問題ですが、

テキストボックス(図形)の枠の線の処理で、各シート毎で線を表示するとしないのボタンを作りたいのですが、お願いします。
条件は、線が表示されていても、印刷はしないようにしたいです(テキストボックスの中の文字は印刷する)
印刷ボタンは、各シートに1枚の印刷ボタンとSheet7に一括印刷ボタンが出来ています。

すみません!よろしくお願いします。

補足日時:2001/06/14 20:59
    • good
    • 0

各テキストボックスにはmyText・・・と名前が付いていることを前提にしています。



Sheet1にコントロールツールボックスからトグルボタンを1つ配置します。
オブジェクト名=togWakuView、Caption="枠を非表示"、Value=False にします。
これをコピーして、Sheet2~Sheet5に貼り付けます。

次を標準モジュールに貼り付けます。
'*** 枠の表示切替 ***
Public Sub WakuView(vwSht As Integer, OnOrOff As Boolean)
Dim shp As Shape
For Each shp In Worksheets("Sheet" & vwSht).Shapes
If Left(shp.Name, 6) = "myText" Then
shp.Select
Selection.ShapeRange.Line.Visible = OnOrOff
End If
Next
End Sub

Sheet1~Sheet5のシートモジュールに貼り付けます。
Private Sub togWakuView_Click()
If togWakuView = False Then
WakuView Right(Me.Name, 1), True
togWakuView.Caption = "枠を非表示"
Else
WakuView Right(Me.Name, 1), False
togWakuView.Caption = "枠を表示"
End If
Range(togWakuView.TopLeftCell.Address).Select
End Sub

トグルボタンを押す毎にテキストボックスの枠の表示・非表示が切り替わります。
こういう主旨でした?

この回答への補足

ありがとうございました。
枠の表示、非表示はばっちりです。
印刷時がダメでした!
表示しているときは、印刷されてしまいます。これはしょうがないですかね!

何かよい方法があったらお願いします。

補足日時:2001/06/16 11:44
    • good
    • 0

>印刷時がダメでした! 表示しているときは、印刷されてしまいます。

これはしょうがないですかね!何かよい方法があったらお願いします。

今、モジュールがどう変わっているか分かりませんので想像ですが、 page_Print に2行追加してみて下さい。
印刷時、枠を非表示にして印刷するはずです。

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

WakuView sPatt, False '******* 追加 *******

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

WakuView sPatt, True '******* 追加 *******

End Sub

この回答への補足

うまくいきません!

>WakuView sPatt, False '******* 追加 *******ここでエラー!変数が定義されていませんになってしまいます。
sPattは何を表しているのかおしえてください。あと、全体的に処理させている内容もいまいちわかりません!すみません勉強不足で・・・多分、私が*****  追加  ******を入れる場所が悪いような気もするのですが・・・・

ただ、プログラムも複雑になってきました。

この処理方法として、枠を表示非表示させるコードの中に印刷ボタンが押されたときに枠が表示状態だったら、エラーメッセージ「非表示にしてください」で印刷キャンセルさせるようにできないか?
 それか、枠表示は、一時的にテキストボックスの位置を動かすための場所が分かるようにするために表示させるだけなので、表示ボタンを押したあと、一度いずれかのテキストボックスがアクティブになり、非アクティブになった時点で非表示になるなどできないかなぁと思っているんですが、どうでしょうか?

よろしくおねがいします。

補足日時:2001/06/18 22:28
    • good
    • 0

回答した、「job_Print」と「page_Print」が今どのようになっているか補足して下さい。

すぐ答えはでると思います。
なお、job_Printのメッセージボックス部分は不要です。(あってもいいですが)

この回答への補足

この部分は、まだテストデータなので、まだ教えていただいたときのままです。

Public Sub job_Print() '指定して連続印刷
Dim myMsg As String 'メセージ
Dim myNum 'インプット帰り値
Dim prtPattern As Integer '印刷パターン、0は全て
Dim startRow As Long '印刷開始行、0は開始、最終行を自動計算
Dim endRow As Long '印刷最終行、0は最終行を自動計算
Dim rowCot As Long '行カウンタ


myMsg = "印刷開始行を入力" & vbLf & "  <0(ゼロ)は全データ>"
myNum = InputBox(myMsg): If Len(myNum) = 0 Then Exit Sub Else startRow = Val(myNum)
If startRow = 0 Then
startRow = 1
endRow = Workbooks(wbNM).Worksheets(wsNM).UsedRange.Rows.Count - 1
ElseIf startRow >= 1 Then
myMsg = "印刷最終行を入力" & vbLf & "  <0(ゼロ)は最終行>"
myNum = InputBox(myMsg): If Len(myNum) = 0 Then Exit Sub Else endRow = Val(myNum)
If endRow = 0 Then
endRow = Workbooks(wbNM).Worksheets(wsNM).UsedRange.Rows.Count - 1
End If
Else
MsgBox "エラー": Exit Sub
End If

Application.ScreenUpdating = False
For rowCot = startRow To endRow '連続ページ印刷
Range("A2") = rowCot
Tensou rowCot, prtPattern
If prtPattern = 0 Or (prtPattern = shtPatt) Then '印刷パターンを判定
page_Print
End If
Next
Application.ScreenUpdating = True
Worksheets("Sheet7").Activate
End Sub

Public Sub page_Print() '単ページ印刷、変更しています
Range("Print_Area").Select: Selection.Font.ColorIndex = 2


ActiveWindow.SelectedSheets.PrintOut 'PrintOut
Selection.Font.ColorIndex = xlAutomatic
Range("Print_Area").Cells(1, 1).Select
End Sub

宜しくお願いします。

補足日時:2001/06/19 13:35
    • good
    • 0

原因が分かりました。



rurucomさんが試されたのは、「エクセルVBAで、テキストボックスにセルの値を入れる」で回答したANo.#13のようです。私はANo.#14でOKと思い、「エクセルVBAで、テキストボックスにセルの値を入れる(3)」のANo.#7では、ANo.#14の印刷VBAを想定して書いています。
問題無ければ修正版のANo.#14で試して下さい。

少し説明を・・・・
ANo.#14の印刷ルーティンは各シートから呼び出したり、一括指示等をしたいということなので
  Public Sub page_Print(sPatt, iPatt As Integer)
に修正しました。
 sPattは印刷パターン(=シート番号)
 iPattは各シートから印刷する時は印刷パターン、一括指示する時はゼロ(全部の意味)です。
 こうやって、iPattでVBA内部で処理を分岐させています。 

WakuView sPatt, False は
 sPattは印刷パターン(=シート番号)
 Falseは線を消す
WakuView sPatt, True
 True は線を表示する意味です。

印刷時うまくいっていれば、シート番号はsPattで分かっているので、WakuViewを使って印刷前に強制的に線を消して印刷後線を表示できると考えています。多分、ANo.#14に2行追加でうまくいくと思います。

この回答への補足

すみません!私も振り返ってみていたら、14番だったことにきずきました。なんだか違うなぁと思いながらすすめてました。
で、早速やってみましたら、コンパイルエラー「ByRef 引数の型が一致しません」になってしましました。多分また私が簡単なミスをしているのじゃないかなぁ?・・・・・

何度の見直してみたのですが、どうもパニックです。またお世話になりますが、よろしくお願いします。



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

WakuView sPatt, False '******* 追加 *******   →sPattここが反転(範囲指定状態)で印

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

WakuView sPatt, True '******* 追加 *******

End Sub

補足日時:2001/06/20 00:15
    • good
    • 0

挿入する2行を


WakuView Val(sPatt), False
WakuView Val(sPatt), True
としてみてください。

この回答への補足

お返事が遅れてすみません。

OKです。うまくいきました。

今、本データで試してます。それでまたもや質問ですが・・・

おしえていただいた、下記のコードで・・・
***(3)***該当しなかった場合にその行のデータを別のシートに並べること出来ませんか?

***(2)***A列に、データがある場合は、判定せずにデータをフォームのシートに送らないと言うことをさせたいのですが、よろしくお願いします。
Public Function Hantei(rowNo As Long) 'パターンの自動認識
With Workbooks(wbNM).Worksheets(wsNM) 'データシートを見る
Hantei = 0
Select Case True '各パターン認識設定(項目にデータの有無を判定)
Case .Range("E" & rowNo + 1) <> "" 'And .Range("E" & rowNo + 1) <> ""
Hantei = 1
Case .Range("C" & rowNo + 1) <> "" And .Range("F" & rowNo + 1) <> ""
Hantei = 2
Case .Range("F" & rowNo + 1) <> "" And .Range("I" & rowNo + 1) <> ""
Hantei = 3
Case .Range("C" & rowNo + 1) <> "" And .Range("I" & rowNo + 1) <> ""
Hantei = 4
End Select
End With
End Function '判定終了

***(3)***それから、贅沢なんですが・・・
プログラムが動いているときに、しばらくお待ちください。と表示させること出来ますか?

***(4)***
結構、いろいろ付け加えてきました。で・・・ユーザーフォームを表示させて値をセルに入れているんですが、この処理が(OKボタンを押したあと)ユーザーフォームを自動で消すには、どんなコードを書いたらいいのですか?
「表示させるには、UserForm1.show でその反対は?」

またお世話になりますが、よろしくお願いします。

補足日時:2001/06/22 23:57
    • good
    • 0

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