はじめての親子ハイキングに挑戦!! >>

エクセルのフォームのリストボックス等を使用して、選んだシートのみを印刷することは出来るのでしょうか。(VBAを使用して)

現状
・シートが15枚あります(シート1,2,3,4は条件入力用でシート5~15は様式でシート5~15は非表示です)
・シート1にリストボックスを配置したいです(リストボックスの選ぶ名前はシート5~15です)

例として
・リストボックスでシート7を選んだときに、シート7を印刷したいです

その他
・リストボックスでなくても、選んだシートが印刷される方法が他にあるのであれば、他の方法でもかまいません。

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

A 回答 (6件)

新しいものを作りました。



http://www.okweb.ne.jp/kotaeru_reply.php3?q=222287


書かれていた内容は間違っていませんでした。
上の新しいものもシート名を変更しただけで
他に変更はしていません。
これを参照して違いが無いか確認してください。


1.B1に数字はありますか
2.B1の数字はリストボックスで作られた数字ですか。
3.シートはありますか。
4.A列にシート名は入っていますか。
5.VBEでブレークポイントを設定、
ステップインで実行、変数「シート名」に
何が入るかを確認してください。



基本的には間違いないと思います。
あとは、シートとマクロの間で整合がとれていない
ためだと思います。

変更点を確認しながら落ち着いて見てみてください。

エラー内容は、シートを見つけられなかった
ということです。シートの指定、リストボックス部分
実際のシート、行・列のズレなどを確認ください。
    • good
    • 0
この回答へのお礼

いろいろ、ありがとうございました

夜遅くまで、回答いただきありがとうございます

実行時エラーが出ていた原因は、リストボックスがシート1にあり、リスト参照元が、別シートでリンクさせていたのでエラーが出ていました(もう少し、詳しく説明すれば、ご迷惑をかけることがなかったと反省しています)

お礼日時:2002/02/23 10:26

1です。

ちょっと長いですが、ラジオボタンについて補足します。

表示→ツールバー→フォームで「フォームツールバー」を表示させます。

その中の、テキストボックスの下あたりにxyzと書かれた枠のようなアイコンがあると思います。マウスでポイントすると「グループボックス」というポップヒントが表示されるはずです。それをクリックして、ワークシートの適当な場所に適当な大きさで枠を作成します。すると、グループ1とか表示された枠が描画されたと思います。
次に、先ほどのツールバーに、トリの目玉のようなアイコンがあると思います。そこをクリックして、先ほどのグループ枠の中をクリックするとオプション1等と書かれた○が表示されるので、それを3回繰り返します。

ここで、その○をそれぞれクリックしてみてください。すると、どれか一つの○をクリックすると、他の○の状態が反転するのにお気づきかと思います。これがラジオボタンです。ラジオのチューニングバンド(FM・AM・SW)切り替えみたいに、単一の動作のみを選択する場合に使うのでラジオボタンといいます。

ところで、先ほど貼り付けた○の上あたりでカーソルの形が(指に?)変わったときに右クリックすると、メニューに「コントロールの書式設定」というのがあるはずです。それをクリックして、「コントロール」というタブを開いてみてください。

その中に「リンクするセル」という項目があると思いますので、現在表示されている適当な番地を入力してダイヤログを閉じてみてください。

さて、その状態で先ほどのラジオボタンをクリックすると、さっき入力したセルに数字が表示されませんか? つまり、この数字を取得することで、動作の分岐ができるわけです。

あとは、どこかに「印刷」ボタンを配置して、それをクリックしたときに、指定したシートを印刷するようにすればいいです。

ブロックの流れとしては、
・印刷ボタンクリック
・リンクセルの数字取得
・数字に応じてワークシートを切り替え
・印刷実行
・メニューのシートに戻る
と言った感じになります。
    • good
    • 0
この回答へのお礼

この方法は便利ですね。

また一つ勉強になりました

ありがとうございます

お礼日時:2002/02/23 10:20

シート名が番号ではない時は


Select Caseで処理を分けてください。

Select Case Cells(1, 2)
Case 1
シート名 = "333"
Case 2
シート名 = "あいう"
1ならシート名333を
2ならシート名あいう、のように

下の部分とSelectを置き換えてください。
シート名 = "sheet" & Cells(1, 2) + 4



Cellsの質問は、その通りです。

この回答への補足

たびたび、すみませんが、なぜエラーが出るのかわからないのですが、よろしくお願いします。

実行時エラー9(インデックスが有効範囲にありません)


Sub 様式指定印刷()

Application.ScreenUpdating = False '画面表示の静止

Select Case Cells(1, 2)

Case 1
シート名 = "工事施工伺"
Case 2
シート名 = "当初設計書"
Case 3
シート名 = "標準工期算定表"
Case 4
シート名 = "審査事項調書"
Case 5
シート名 = "工事設計変更伺"
Case 6
シート名 = "変更設計書"
Case 7
シート名 = "変更増減表"
Case 8
シート名 = "出来高設計書"
Case 9
シート名 = "工事検査依頼書"
Case 10
シート名 = "工事検査依頼書1"
Case 11
シート名 = "工事完成検査復命書"
Case 12
シート名 = "検査写真帳"
Case 13
シート名 = "検査員任命書"
Case 14
シート名 = "検査員復命書"

End Select



Worksheets(シート名).Visible = True 'シート表示(印刷用)・・・ここでエラーが出る

Sheets(シート名).PrintPreview 'PrintOut以降をPrintPreviewに変更するとプレビュー画面・・・シート表示(印刷用)を消した場合はここでエラーが出る

Worksheets(シート名).Visible = False 'シート非表示(戻し)

Application.ScreenUpdating = True '画面表示の静止解除

End Sub

補足日時:2002/02/23 00:35
    • good
    • 0

下のマクロを使ってください。



Sub Macro1()
Application.ScreenUpdating = False
'画面表示の静止

シート名 = "sheet" & Cells(1, 2) + 4
'セルB1に入った数字をシート名に置き換え

Worksheets(シート名).Visible = True
'シート表示(印刷用)



'プレビューです。変更可能です。
Sheets(シート名).PrintPreview
'Sheets(シート名).PrintOut Copies:=1
'一応プレビューとしましたが、上のもので
'置き換えると印刷します。



Worksheets(シート名).Visible = False
'シート非表示(戻し)

Application.ScreenUpdating = True
'画面表示の静止解除

End Sub


B1に結果が表示されるように
リストボックスを作ってください。
シート5 が 1
シート6 が 2
シート15 が 11

この回答への補足

すみませんが、実行時エラーがでるのですが

・シート5から15の名称を変更すると実行時エラー9(インデックスが有効範囲にありません)とでます
例:シート5を「333」 シート7を「あいう」 シート10を「様式」
   シート名は固定です

・下記のCells(1, 2)はB1ですよね
   たとえば、C5はCells(5, 3)でいいんですか?
 シート名 = "sheet" & Cells(1, 2) + 4

よろしくお願いします。

補足日時:2002/02/22 15:14
    • good
    • 0

module1に次ぎの内容を入力する。


Sub aaa001()
a=inputbox("sheet=")
Sheets(a).PrintOut Copies:=1
End Sub
それを実行すると、sheet名を聞いてきて、sheet1や
sheet2を入力すると入力したシートの内容が印刷されました。
    • good
    • 0
この回答へのお礼

実行時エラー1004の処理に時間がかかったので、お礼が遅くなりすみません

ちょっと不便ですけれども、こういう方法もあるのだなと、わかりました

ありがとうございます

お礼日時:2002/02/23 10:17

こんばんわ。



一応、VBAは理解できるという前提で回答いたします。

・まず、リストでシート名を選択するセルですが、シート名が忠実に入力できるか、あるいは、簡単のために数字で選択できるようにして表示形式で「シート5」などと表示させるようにする。
・印刷ボタンを配置する。
・ボタンをクリックしたときに、先ほどのセルを参照し、セルの値が5ならばシート5をアクティブにし、印刷を実行する。

と言う手順で問題ないと思います。

なお、そういう使用法であれば、ラジオボタンの方が使い勝手がいいと思います。

この回答への補足

ラジオボタンはどのようにして使用するのですか

ラジオボタンは名前も聞いたことがないので、今回の場合の使いかたを詳しく教えていただけたら、嬉しいのですが。

補足日時:2002/02/22 17:54
    • good
    • 0

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

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

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

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

このQ&Aと関連する良く見られている質問

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QEXCEL マクロ リストボックスよりシート名を選択してシートを選択

こんばんは.
エクセルを使って備品の管理システムを構築したいと考えております.
マクロを使います.
VBAは初心者です.

・備品を20種類ほどに分類し,シートも同様に20作りました.
・ウィンドウを2つに分割し,上下に並べています.
・上ウィンドウの最初のシート(シート名:備品一覧)のB2セルにリストボックスを設け,そのリストで20種の備品の中から一つを選択できるようにしています.
・リストボックスの側にマクロ対応のボタンを設置しております

やりたいこととしては・・・
『上ウィンドウのリストボックスで備品を選択し,ボタンをクリックすることによって,下ウィンドウでその選択した備品名のシートに移動する』
です.

私が組んでみたマクロは下記です.
----------------
Sub 備品を選択  

  Dim sheetname As String

'リストボックスからシート名を取得する
sheetname = Range("B2").Value

'下ウィンドウをアクティブにしてシートを選択する
Windows(2).Activate
Worksheets("sheetname").Select

End Sub
------------------

エラーは,『Worksheets("sheetname").Select』のところで
【実行値エラー'9' インデックスが有効範囲にありません.】

参考書やグーグルで調べてもわかりませんでした.
ご教授いただければ幸いです.
よろしくお願い致します.

こんばんは.
エクセルを使って備品の管理システムを構築したいと考えております.
マクロを使います.
VBAは初心者です.

・備品を20種類ほどに分類し,シートも同様に20作りました.
・ウィンドウを2つに分割し,上下に並べています.
・上ウィンドウの最初のシート(シート名:備品一覧)のB2セルにリストボックスを設け,そのリストで20種の備品の中から一つを選択できるようにしています.
・リストボックスの側にマクロ対応のボタンを設置しております

やりたいこととしては・・・
『上ウィン...続きを読む

Aベストアンサー

この辺の問題ではないでしょうか?

  ×Worksheets("sheetname").Select
  ○Worksheets(sheetname).Select

QExcelでのVBA チェックボックスから印刷

初心者です。お世話になります。Excel2003を利用しています。
ユーザフォームに、CheckBoxを配置してあります。
CheckBoxを選択し、印刷ボタンを押したら印刷できるようにしたいのですが、CheckBoxを選択したらの部分が分かりません。
ここのHPにあるhttp://www.asahi-net.or.jp/~zn3y-ngi/YNxv98b2.html
のを参考にしています。
HPに書いてある、「Private Sub チェックボックスの選択結果を調べる()」をどう改造していいのか分かりません。
ご教授、よろしくお願い致します。

Aベストアンサー

こんばんは。

VBAを習い始めてから、どのぐらい経ちましたか?

私の経験からの想像ですが、たぶん、この規模のものを楽に作るには、丸2年ぐらい経験が必要だと思います。えっ!と、疑問に思われるかもしれませんが、サンプルのコードですと、数ヶ月レベルなのに、実務だと、それだけの経験が必要とは納得いかないかもしれませんね。

頭の中で、VBAの組み立てができていればよいのですが、なかなか、習っている状態では見えてこないのです。少し大きなものだとできません。

私が、今回と同等ののもので苦労したのは、VBAを始めて3年目で、掲示板でもほぼ解答できていたので、できるつもりになっていたのです。頼まれたものだったので、相手にお詫びした、苦い経験があります。

『かんたんプログラミング Excel2003 VBA 基礎編』技術評論社 (2004/02)
大村 あつし (著)
http://www.amazon.co.jp/exec/obidos/ASIN/4774119660

このシリーズ3部が全部読みきれている状態で、やっと、なんとか、VBAの入門が終わったレベルだと思ってよいようです。(一回目の読みきりが、6ヶ月ぐらいです。半分ぐらいしか理解できません。しかし、VBAの教本というのは、なぜか、詳しいことを書いていないのです。困ったものですね。詳しいものは、みんな絶版になってしまいました。)

たぶん、今回は、印刷設定の問題だとは思いますが、最初の印刷設定の(VBAとは関係のない)部分で通じていないので、前の方も分からないということだったと思います。

サンプルを示しておきます。こういうのは、教わらないとできるようになりません。みなさん、同じだと思います。

チェックボックスが、12個
コマンドボタン、1個

なお、Worksheets("SSS").Select を、UserForm_Intialize() の中に入れておくと良いです。
今回は、印刷範囲だけが、メッセージボックスで出てくるだけです。

UserFormモジュール
'--------------------------
Private Sub CommandButton1_Click()
  Dim i As Integer
  Dim j As Integer
  Dim ar(11) As Variant
  For i = 1 To 12
    ar(i - 1) = Me.Controls("CheckBox" & i).Value
  Next i
  For j = 0 To 11
   If ar(j) Then
     With ActiveSheet
      .PageSetup.PrintArea = Cells(100 * j + 1, 1).Resize(100).Address
      MsgBox Cells(100 * j + 1, 1).Resize(100).Address '検査用
      '.PrintPreview 'プリント・ブレビュー
     End With
   End If
  Next j
  'チェックボックスを全てオフにする
  For i = 1 To 12
    Me.Controls("CheckBox" & i).Value = False
  Next i
End Sub

こんばんは。

VBAを習い始めてから、どのぐらい経ちましたか?

私の経験からの想像ですが、たぶん、この規模のものを楽に作るには、丸2年ぐらい経験が必要だと思います。えっ!と、疑問に思われるかもしれませんが、サンプルのコードですと、数ヶ月レベルなのに、実務だと、それだけの経験が必要とは納得いかないかもしれませんね。

頭の中で、VBAの組み立てができていればよいのですが、なかなか、習っている状態では見えてこないのです。少し大きなものだとできません。

私が、今回と同等ののもので...続きを読む

QExcel VBA 検索して該当行を抽出

はじめまして、下記のように、Excelでマクロを組みたいのですが
組み方がわかりません。
ご教授願えませんでしょうか。

MS Ofiice2010 生徒数500名ほど
シート1には生徒の生徒番号、氏名などがあります。
     A     B     C     D
1 生徒番号   氏名   備考
2 120001     田中
3 120002     山田  試験時休み
4 T120009    相田   転入

シート2には生徒の成績表:生徒番号、氏名、国語、算数、理科、社会
生徒番号でソートされていません。
     A     B     C     D     E     F   
1 生徒番号   氏名   国語   算数   理科   社会  
2 120001     田中   80    65     65     75
3 T120009    相田   90    85     80     80

シート1の生徒番号でシート2生徒番号を検索して、該当したら成績を
シート1の検索した生徒番号のD列以降にコピーしたいのですが
     A     B     C     D     E     F     G
1 生徒番号   氏名   備考   国語   算数   理科   社会
2 120001     田中         80    65     65     75
3 120002     山田  試験時休み


10 T120009    相田   転入    90    85     80     80

お手数ですが、ご教授願えますでしょうか。
よろしくお願いいたします。

はじめまして、下記のように、Excelでマクロを組みたいのですが
組み方がわかりません。
ご教授願えませんでしょうか。

MS Ofiice2010 生徒数500名ほど
シート1には生徒の生徒番号、氏名などがあります。
     A     B     C     D
1 生徒番号   氏名   備考
2 120001     田中
3 120002     山田  試験時休み
4 T120009    相田   転入

シート2には生徒の成績表:生徒番号、氏名、国語、算数、理科、社会
生徒番号でソートされていません。
   ...続きを読む

Aベストアンサー

こんばんは!
関数ではダメですか?

Sheet1のD2セルに
=IF(COUNTIF(Sheet2!$A:$A,$A2),VLOOKUP($A2,Sheet2!$A:$F,COLUMN(C1),0),"")
という数式を入れオートフィルで列方向・行方向にコピー!

これで大丈夫だと思いますが・・・

※ どうしてもVBAでやりたい場合は、一例です。

Alt+F11キー → メニュー → 挿入 → 「標準モジュール」を選択 → VBE画面に
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() 'この行から
Dim i As Long, n As Long, c As Range, wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")

For i = 2 To wS1.Cells(Rows.Count, 1).End(xlUp).Row
Set c = wS2.Columns(1).Find(what:=wS1.Cells(i, 1), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
n = c.Row
wS2.Cells(n, 3).Resize(1, 4).Copy wS1.Cells(i, 4)
End If
Next i
End Sub 'この行まで

こんな感じではどうでしょうか?m(_ _)m

こんばんは!
関数ではダメですか?

Sheet1のD2セルに
=IF(COUNTIF(Sheet2!$A:$A,$A2),VLOOKUP($A2,Sheet2!$A:$F,COLUMN(C1),0),"")
という数式を入れオートフィルで列方向・行方向にコピー!

これで大丈夫だと思いますが・・・

※ どうしてもVBAでやりたい場合は、一例です。

Alt+F11キー → メニュー → 挿入 → 「標準モジュール」を選択 → VBE画面に
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() 'この行から
...続きを読む

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QExcel内での検索結果をシートに出力したい

こんばんは。いつも大変お世話になっています。

Excel2003にて、あるシートの中から
対象の文字列があるかどうか検索をしました。
検索時に「すべて検索」にすると、
全結果が表示されますよね。
その内容をExcelのシートに出力することは
できないでしょうか・・・。

どのセルの位置にその対象文字列がいてということを
報告書として作成したいのです。

イメージがうまくかけませんが、どなたかよい方法を
ご存知でしたら教えてください。
何か記述で足りないものがあれば、すぐに記述いたします。

Aベストアンサー

丸投げですか(^^;
以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はワークシート画面に戻ってALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。

勉強になりませんので解説や再修正はしません。もし修正が必要ならご自身でお願いします。

Sub Macro1()
Dim ret
Dim r As Range
Dim adr As String
Dim cnt As Long
Dim psw As Boolean
Dim mySht, adSht, ws As Worksheet
  Set mySht = ActiveSheet
  ret = Application.InputBox("検索文字列を入力してください")
  If TypeName(ret) <> "Boolean" Then
    With mySht.Cells
      Set r = .Find(ret, LookIn:=xlValues, lookat:=xlPart)
      If Not r Is Nothing Then
        adr = r.Address
        cnt = 1
        For Each ws In Worksheets
          If ws.Name = "検索結果" & ret Then
            psw = True
            Exit For
          End If
        Next ws
        If psw Then
          Set adSht = ws
          adSht.Cells.ClearContents
        Else
          Set adSht = Worksheets.Add
          adSht.Name = "検索結果" & ret
        End If
        adSht.Cells(cnt, 1).Value = r.Value
        adSht.Cells(cnt, 2).Value = adr
        Do
          Set r = .FindNext(r)
          If r.Address = adr Then
            Exit Do
          Else
            cnt = cnt + 1
            adSht.Cells(cnt, 1).Value = r.Value
            adSht.Cells(cnt, 2).Value = r.Address
          End If
        Loop
      End If
    End With
  End If
  mySht.Activate
End Sub

丸投げですか(^^;
以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はワークシート画面に戻ってALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。

勉強になりませんので解説や再修正はしません。もし修正が必要ならご自身でお願いします。

Sub Macro1()
Dim ret
Dim r As Range
Dim adr As String
Dim cnt As Long
Dim psw As Boolean
Dim mySht, adSht, ws As Wo...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。


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

人気Q&Aランキング