Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3137 / 13644 ツリー ←次へ | 前へ→

【63956】どの構文を使えばいいのか教えて下さい ユーリ 10/1/3(日) 23:40 質問[未読]
【63960】Re:どの構文を使えばいいのか教えて下さい [名前なし] 10/1/4(月) 15:19 発言[未読]
【63961】Re:どの構文を使えばいいのか教えて下さい ユーリ 10/1/4(月) 21:27 発言[未読]
【63962】Re:どの構文を使えばいいのか教えて下さい [名前なし] 10/1/5(火) 9:04 発言[未読]
【63972】Re:どの構文を使えばいいのか教えて下さい ユーリ 10/1/5(火) 23:14 発言[未読]
【63965】回答その1:どの構文を使えばいいのか教え... [名前なし] 10/1/5(火) 18:02 回答[未読]
【63966】回答その2:どの構文を使えばいいのか教え... [名前なし] 10/1/5(火) 18:06 回答[未読]
【63968】回答その2の訂正 [名前なし] 10/1/5(火) 18:12 回答[未読]
【63971】【重要な説明漏れ】回答その2:どの構文を... [名前なし] 10/1/5(火) 19:10 回答[未読]
【63967】会とぷその3:どの構文を使えばいいのか教... [名前なし] 10/1/5(火) 18:08 回答[未読]
【63969】【バグあり】回答その3:どの構文を使えば... [名前なし] 10/1/5(火) 18:52 回答[未読]
【63970】【デバッグ完了】回答その3:どの構文を使... [名前なし] 10/1/5(火) 19:03 回答[未読]
【64020】Re:どの構文を使えばいいのか教えて下さい ユーリ 10/1/10(日) 12:04 お礼[未読]

【63956】どの構文を使えばいいのか教えて下さい
質問  ユーリ  - 10/1/3(日) 23:40 -

引用なし
パスワード
   新年明けましておめでとうございます。
現在VBAを勉強中の身なのですが、色々と本を読んだのですが、
自分がやりたいと思う仕様にあった構文が見当たりません。

Excelファイル(数十個)が一覧となっていて、
そのExcelファイルの検索ツールみたいなものを創ろうと考えています。

===仕様===
オプションボタン1(A〜C)とオプションボタン2(D〜F)と
二つのオプションボタンを選んでもらって、
その選択したオプションボタンに該当するエクセルファイル(ハイパーリンクでリンクしようと思ってます)を表示する仕様です。

===質問===
オプションボタン1を選択した時点で、
該当するエクセルファイルを絞り込もうと思うのですが、

オプションボタン選択→すぐに絞込み
逆に、オプションボタン1のボタンチェックを解除したら、絞込みを戻す。
(オートフィルター的な感じ)

をどうすればできるか検討がつきません。
何か良い方法(構文)はありますでしょうか?

お暇なときがありましたら、どなたかご教授願いますでしょうか?
以上、よろしくお願い致します。

【63960】Re:どの構文を使えばいいのか教えて下さい
発言  [名前なし]  - 10/1/4(月) 15:19 -

引用なし
パスワード
   ▼ユーリ さん:

 おやりになりたいことをもう少し理解するために質問させてください。

 1.まずエクセルの一覧ですが、すでにブック(シート)として存在する?
   あるいは、特定のフォルダから、その時点で存在するブックを
   ダイナミックに抽出して一覧にする?

 2.イメージとしては一覧シートを表示しながら抽出を行う?
   あるいは、それをユーザフォーム上に表示して作業を行う?

 3.前項のイメージにも関係しますが、オプションボタンは一覧シート上に
   配置する?
   あるいはユーザフォームに配置する?

 4.なにより知りたいのは、A〜C,D〜Fが何を指しているのか?
   たとえばオプション1でBを選び、オプション2でEを選ぶということは
   具体的にはどういう条件なのか?

 5.ハイパーリンクは絶対条件?
   それとも該当するブックが開かれればそれでOK?

【63961】Re:どの構文を使えばいいのか教えて下さい
発言  ユーリ  - 10/1/4(月) 21:27 -

引用なし
パスワード
   お返事ありがとうございます。
説明がわかりづらくて申し訳ありませんでした。
以下、回答いたします。よろしくお願い致します。

1.まずエクセルの一覧ですが、すでにブック(シート)として存在する?     あるいは、特定のフォルダから、その時点で存在するブックを
  ダイナミックに抽出して一覧にする?
  
 >特定のフォルダからダイナミックに抽出します。
  開いた時点で、指定フォルダ(これは決まっています)内にある
  エクセルファイルを表示したいです。


2.イメージとしては一覧シートを表示しながら抽出を行う?
  あるいは、それをユーザフォーム上に表示して作業を行う?
   
 >一覧シートを表示しながらの抽出になります。

3.前項のイメージにも関係しますが、オプションボタンは一覧シート上に
  配置する?
  あるいはユーザフォームに配置する?
 
 >一覧シート上です。
  一覧の上段がオプションボタン、下段が一覧(抽出結果)のイメージです


4.なにより知りたいのは、A〜C,D〜Fが何を指しているのか?
  たとえばオプション1でBを選び、オプション2でEを選ぶということは
  具体的にはどういう条件なのか?
  
 >A〜C、D〜Fは検索条件になります。
  年齢:A 20代
     B 30代
     C 40代

  職業:D 営業
     E 事務
     F SE

  という感じです。年齢(or職業)にチェックを付けた時点で、
  一覧表を絞り込みしたいと思います。

5.ハイパーリンクは絶対条件?
  それとも該当するブックが開かれればそれでOK?

 >条件に合致するファイルが複数個存在する場合があります。
  ユーザが絞り込まれた一覧表のハイパーリンクをクリックして、
  好きにファイルを閲覧できればと思います。

以上になります。
説明が足らない場合は、申し訳ありませんがまた
質問をお願い致します。
お忙しい中、大変恐縮ですがよろしくお願いします。

【63962】Re:どの構文を使えばいいのか教えて下さい
発言  [名前なし]  - 10/1/5(火) 9:04 -

引用なし
パスワード
   ▼ユーリ さん:

おはようございます。
整理、ありがとうございました。
ほぼ、イメージ把握できました。
1点、教えてください。

各ブックが持つ年齢、職業の条件は
・各ブック名に規則があって、それで判断する?
・各ブックのどこか特定のセルにその条件が入力されており、
 そこを判断材料にする?
・各ブックのプロパティの特定項目を利用して、そこに条件が設定されている?

以上、よろしくお願いします。

【63965】回答その1:どの構文を使えばいいのか教...
回答  [名前なし]  - 10/1/5(火) 18:02 -

引用なし
パスワード
   ▼ユーリ さん:

ユーリさんの確認をいただいていないのですが、以下の前提で実装します。

・属性は各ブックのプロパティの「属性」に、nn/職種と登録してある。
  nnは20,30,40。年代を半角数字で入力し、半角の/で区切って
  営業、事務、SE (SEは半角大文字)のいずれか。
・シート上のコントロールはフォームではなくコントロールツールボックスを
 使用。
・チェックボックスではなくオプションボタンをご希望でしたので各属性の
 ボタンは3つではなく4つ(全年齢層、全職種)

私自身は、コードブックとデータブックをわけて管理したいたちでして、シート上にコントロールを配置したデータ処理は、あまり好みではないのですがご要請ですので。

・コードのほとんどは標準モジュール上に記述。シートモジュールでは
 プロシジャの呼び出しのみにしてあります。
・ユーザが抽出されたシートをそのまま保存してしまわないよう、このブックは
 読み取り専用にしておくことを推奨します。
・実装環境は2003です。たとえば属性などの抽出を行う際にインデックスを
 使用しますがOSが変れば、このインデックス番号もかわるようです。
 またブックの識別子も2007ではxlsではなくなっていますね。
 もしユーリさんの環境が2003ではない場合、標準モジュールの
 最初のほうにあるmyExtとmyCatを適切なものに変更してください。
・抽出フォルダはハードコーディングしてあります。
 標準モジュールの最初のほうのmyFolderを適切なものに変更してください。
 (実行前にフォルダを指定させるダイアログボックスを出すことも可能ですが、
  とりあえずハードコーディングにしてあります)

★ふんどしのように長くなりますのでシートの準備手順、コードのご紹介は
 夫々わけて次の記事と次の次の記事でアップします。

【63966】回答その2:どの構文を使えばいいのか教...
回答  [名前なし]  - 10/1/5(火) 18:06 -

引用なし
パスワード
   シートの準備手順

  1)シートが1枚のみのブックを準備。
  2)1行目をコントロールの配置領域にしますが、デザインを考慮し
    順序としては4)の後で。
  3)2行目にタイトルとしてB1「ブック名」、B2「年齢」,B3「職種」を入力。
   (タイトル名は上記と異なっていてもOKです。)
  4)もし、シート上でブックに対する属性(年齢、職種)を表示したく
    なければこの2列を非表示にしてください。
   (表示でも非表示でもかまいません)
  5)1行目にコントロールを配置してください。
   ・チェックボックスではなくオプションボタンをご要望でしたので、
    各条件に対しボタンは3つではなく4つ配置します。
    (オプションボタンは選択後、非選択の状態にすることができないため)
    コントロールを貼り付けるとOptionButton1 等になりますがプロパティで    名前を以下に変更してあります。(Captionも適切な言葉に変更)
    btn_20、btn_30、btn_40、btn_AllAge
    btn_営業、btn_事務、btn_SE、btn_AllJob
    またbtn_AllAgeとbtn_AllJobの初期バリューをTrueにしてください。
    当方の実装は1行目のセルの高さを拡張し各属性ごとにボタンを縦に
    4つ配置しました。
   ・そのほかに、コマンドボタンを1つ配置。
    btn_終了という名前、Captionも「終了」
    (ハイパーリンクでブックを表示し、それを閉じる際に間違えて一番上の
     Xマークを押してエクセルが終了してしまうのを避けるためXマークは
     無効にしています。)

【63967】会とぷその3:どの構文を使えばいいのか...
回答  [名前なし]  - 10/1/5(火) 18:08 -

引用なし
パスワード
   コードの記述

  まず、シート上のコントロールをクリックしてできあがるシートモジュール上
  に必要なコードを書くことからはじめてもいいのですが、以下にコードを
  貼り付けますのでそれを指定のモジュールにコピペするほうが早いですね。
  なお、FileSystemObjectを使用しますのでMiscrosoft Scripting Runtime に
  参照設定をしておいてください。

【ワークブックモジュール】

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

 If flag正常終了 = False Then
  MsgBox "終了時は必ず終了ボタンを押してください"
  Cancel = True
 Else
  If Workbooks.Count = 1 Then Application.Quit
 End If
 
End Sub

Private Sub Workbook_Open()

 一覧作成
 
End Sub

【シートモジュール】

Option Explicit

Private Sub btn_20_Click()
 age絞込み 20
End Sub

Private Sub btn_30_Click()
 age絞込み 30
End Sub

Private Sub btn_40_Click()
 age絞込み 40
End Sub

Private Sub btn_AllAge_Click()
 age絞込み 99
End Sub

Private Sub btn_AllJob_Click()
 job絞込み 99
End Sub

Private Sub btn_SE_Click()
 job絞込み "SE"
End Sub

Private Sub btn_営業_Click()
 job絞込み "営業"
End Sub

Private Sub btn_事務_Click()
 job絞込み "事務"
End Sub

Private Sub btn_終了_Click()
 終了
End Sub

【標準モジュール】

Option Explicit
'【参照設定】 Microsoft Scripting Runtime (FileSystemObject使用)

Public flag正常終了 As Boolean
Const myFolder = "c:\Documents and Settings\user\My Documents" '<==抽出フォルダを規定
Const myExt = "xls" '<==2003
Const myCat=12   '<==2003

Sub 一覧作成()
Dim myLine As Long
Dim wkAge
Dim wkJob
Dim itsMe As String
Dim myFSO As Scripting.FileSystemObject
Dim myBook As Scripting.File
Dim GDOFolder As Object
Dim myCategory As String
Dim aaa

 Set myFSO = New Scripting.FileSystemObject
 Set GDOFolder = CreateObject("Shell.Application").Namespace(myFolder)

 itsMe = ThisWorkbook.Name
 
 With ActiveSheet
 
 myLine = 3
 
 For Each myBook In myFSO.GetFolder(ThisWorkbook.Path).Files
 
  If LCase(myFSO.GetExtensionName(myBook.Name)) = myExt And _
    myBook.Name <> itsMe Then
   
    .Hyperlinks.Add Anchor:=.Cells(myLine, 1), _
           Address:=myFolder & "\" & myBook.Name, _
           TextToDisplay:=myBook.Name
           
    wkAge = ""
    wkJob = ""
   
    myCategory = GDOFolder.GetDetailsOf(GDOFolder.ParseName(myBook.Name), myCat)
    If myCategory <> "" Then
     aaa = Split(myCategory, "/")
     wkAge = aaa(0)
     If UBound(aaa) >= 1 Then wkJob = aaa(1)
    End If
   .Cells(myLine, 2).Value = wkAge
   .Cells(myLine, 3).Value = wkJob
   
   myLine = myLine + 1
  
  End If
  
 Next
 
 .Range("A2").CurrentRegion.AutoFilter
 
 End With
 
 Set myFSO = Nothing
 
End Sub

Sub 終了()

 flag正常終了 = True
 ThisWorkbook.Close savechanges:=False
 
End Sub

Sub age絞込み(btnVal)

 If btnVal = 99 Then
  ActiveSheet.Range("A2").CurrentRegion.AutoFilter field:=2
 Else
  ActiveSheet.Range("A2").CurrentRegion.AutoFilter field:=2, Criteria1:=btnVal
 End If

End Sub

Sub job絞込み(btnVal)

 If btnVal = 99 Then
  ActiveSheet.Range("A2").CurrentRegion.AutoFilter field:=3
 Else
  ActiveSheet.Range("A2").CurrentRegion.AutoFilter field:=3, Criteria1:=btnVal
 End If
 
End Sub

【63968】回答その2の訂正
回答  [名前なし]  - 10/1/5(火) 18:12 -

引用なし
パスワード
   >  3)2行目にタイトルとしてB1「ブック名」、B2「年齢」,B3「職種」を入力。

お気づきでしょうが間違ってましたね。
B1,B2,B3ではなくA2,B2,C2ですよね。
お恥ずかしい。

【63969】【バグあり】回答その3:どの構文を使え...
回答  [名前なし]  - 10/1/5(火) 18:52 -

引用なし
パスワード
   個人のテスト環境で実装したものをユーリさんにお渡しするために
テスト段階でハードコーディングしていたものを若干修正してアップ
したんですが、バグがありエラーになります。
デバッグ後、あらためて修正箇所をアップします。

【63970】【デバッグ完了】回答その3:どの構文を...
回答  [名前なし]  - 10/1/5(火) 19:03 -

引用なし
パスワード
   1箇所、パス名を間違えている部分があります。
【標準モジュール】

 (間違い)
 For Each myBook In myFSO.GetFolder(ThisWorkbook.Path).Files
 
 (正しくは)

 For Each myBook In myFSO.GetFolder(myFolder).Files

よろしくお願いします。

【63971】【重要な説明漏れ】回答その2:どの構文...
回答  [名前なし]  - 10/1/5(火) 19:10 -

引用なし
パスワード
   何度もごめんなさい。
ボタン配置の説明でぬけていたことがありました。
年齢層のボタンと職種のボタンは、それぞれプロパティの
GroupNameを分けておいてください。
たとえば年齢層ボタン群はAge、職種ボタン群はJob。

【63972】Re:どの構文を使えばいいのか教えて下さい
発言  ユーリ  - 10/1/5(火) 23:14 -

引用なし
パスワード
   こんばんわ。

ありがとうございました!!
こんなに詳しく、そして丁寧にご教授頂けるとは思っていませんでした。
言葉でしか御礼できないのが非常に心苦しい限りです。

今帰宅しまして、折角色々記述頂いたのですが、
解読に時間がかかっております。まだ勉強中の身なので、
本とにらめっこしながら、記載頂いた内容を解読中です。

ご質問がありました内容をお答えします。


・各ブックのどこか特定のセルにその条件が入力されており、
 そこを判断材料にする?
 >はい。2シート目とかに一覧を設けて管理するのが
  一番良いかと考えております。

これが判断材料になりますが、より良い方法がありましたら、
アドバイスをいただけると幸いです。

お忙しい中、大変恐縮ですがよろしくお願い致します。

【64020】Re:どの構文を使えばいいのか教えて下さい
お礼  ユーリ  - 10/1/10(日) 12:04 -

引用なし
パスワード
   本当に丁寧にご回答頂きありがとうございました。
今日出社して、作成してみます。

回答していただいたのに、すぐに着手できなくて
大変申し訳ありません。

マクロの本はたくさん買っても、実際に取り組んでみないと
身につきませんね………

また質問することがあるかと思いますが、
もしお気づきになられたらで良いので、そのときは
ご教授願います。

本当にありがとうございました。

3137 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free