Excel VBA質問箱 IV

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

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


5579 / 13645 ツリー ←次へ | 前へ→

【50050】リスト化したい 多摩川 07/7/6(金) 8:24 質問[未読]
【50052】Re:リスト化したい Jaka 07/7/6(金) 9:44 発言[未読]
【50053】追加 Jaka 07/7/6(金) 9:51 回答[未読]
【50056】Re:追加 多摩川 07/7/6(金) 10:00 質問[未読]
【50057】Re:追加 Jaka 07/7/6(金) 10:39 発言[未読]
【50058】Re:追加 多摩川 07/7/6(金) 10:55 お礼[未読]

【50050】リスト化したい
質問  多摩川  - 07/7/6(金) 8:24 -

引用なし
パスワード
   恐れ入りますが,お力をお貸し下さい。

   A列   B列    C列
1行 保存場所 ファイル名 シート名
2行 

上記のように2行目以降に保存場所,ファイル名及びシート名を入力するさせようと考えています。
その方法として,Worksheet_BeforeDoubleClick イベントを利用し,B列はダブルクリックすることで,Worksheet_BeforeDoubleClick イベントを発生させ,ファイル選択画面(GetOpenFilename)からファイル名を取得させます。
同時にA列にそのパスを記入させます。
C列もダブルクリックイベントを発生させ,ブックの全シート名をリスト化して必要なシートを選択入力させようと考えています。
以下のコードにしてみました。


'----- 全てシートモジュールに -------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
       Cancel As Boolean)
  Dim OpenFile As String
  Dim SearchFile As String
  Dim MyFName As String
  Dim MyCell As String
  Dim shn() As Long
  Dim FileCounter As Long
  Dim i As Long

  If Application.Intersect(Target, Range("B2:C65535") Is _
    Nothing Then Exit Sub
  Select Case Target.Column
    Case 2
      MyCell = ActiveCell
      MyFName = Application.GetOpenFilename _
           (Title:="ファイルを選んで下さい", _
            FileFilter:="Excelファイル(*.xls),*xls")
      If MyFName = "False" Then
        ActiveCell = MyCell
      Else
        ActiveCell = Dir(MyFName)
      End If
      ActiveCell.Offset(, -1) = CurDir
    Case 3
      OpenFile = ActiveCell.Offset(, -1)
      FilePath = ActiveCell.Offset(, -2)
      SearchFile = FilePath & "\" & OpenFile
      If SearchFile = "" Then Exit Sub
      Application.ScreenUpdating = False
      Workbooks.Open SearchFile
      FileCounter = Worksheets.Count
      For i = 1 To FileCounter
        ReDim Preserve shn(i): shn(i) = Sheets(i).Name
      Next i
      With Selection.Validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, _
        Formula1:=" ※ここの記述の仕方がわかりません! "
      End With
      Workbooks(OpenFile).Close (False)
      Application.ScreenUpdating = True
  End Select
  Cancel = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  If Application.Intersect(Target, Range("C2:C65535")) Is _
    Nothing Then Exit Sub
  If Target.Column = 3 Then
    With Selection.Validation
      .Delete
      .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, _
      Operator:=xlBetween
    End With
  End If
End Sub

上記の※のところなのですが,取得した変数shn(i)をリスト化したいのですが,どのように記述したらよいのか分かりませんでした。
どのようにすればよいのでしょうか?よろしくお願いします。

【50052】Re:リスト化したい
発言  Jaka  - 07/7/6(金) 9:44 -

引用なし
パスワード
   変数に文字列を作って使うか
変数 = "Sheet1,Sheet2,Sheet3,Sheet4"
Formula1:=変数

直接
Formula1:="Sheet1,Sheet2,Sheet3,Sheet4"

(注)文字数は、確か255字まで

【50053】追加
回答  Jaka  - 07/7/6(金) 9:51 -

引用なし
パスワード
   変数の文字数数えてないけど(EXL2000以上)

配列 = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")
変数 = Join(配列, ",")
With Selection.Validation
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
   Operator:=xlBetween, _
   Formula1:=変数
End With

【50056】Re:追加
質問  多摩川  - 07/7/6(金) 10:00 -

引用なし
パスワード
   ▼Jaka さん:
ありがとうございます

>変数の文字数数えてないけど(EXL2000以上)
>
>配列 = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")
>変数 = Join(配列, ",")
>With Selection.Validation
>  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
>   Operator:=xlBetween, _
>   Formula1:=変数
>End With

すいません。説明が足りませんでした。
Jaka さんに提示いただいた方法ですと,シート数が限定されると思うのですが,ブック毎にシート数が異なるためshn(i)と配列にしてあります。
可変シート数に対応できるようにしたいのですが・・・
リスト化って方法が思いついたので使ってみたのですが,別な方法がいいのでしょうか?

【50057】Re:追加
発言  Jaka  - 07/7/6(金) 10:39 -

引用なし
パスワード
   ▼多摩川 さん:
>すいません。説明が足りませんでした。
>Jaka さんに提示いただいた方法ですと,シート数が限定されると思うのですが,ブック毎にシート数が異なるためshn(i)と配列にしてあります。
>可変シート数に対応できるようにしたいのですが・・・
例えとして
>>配列 = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")
こんな風に固定で書いてますけど、この辺は自分で配列を作っても同じです。
でも、文字数の制限があるから「シート数が限定されると」になるとは思いますけど、

他だと、どこか適当な作業セルを使って、それを参照させるしかないと思います。

【50058】Re:追加
お礼  多摩川  - 07/7/6(金) 10:55 -

引用なし
パスワード
   ▼Jaka さん:
>他だと、どこか適当な作業セルを使って、それを参照させるしかないと思います。
視覚的に目立たないようなコードやセル配置の工夫をして作業セルから参照させるようにします。
ありがとうございました。

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