Excel VBA質問箱 IV

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

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


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

【24763】Findメソッドを使っても、見つからない…。 monmon 05/5/9(月) 4:37 質問[未読]
【24764】Re:Findメソッドを使っても、見つから... ウッシ 05/5/9(月) 8:57 回答[未読]
【24765】Re:Findメソッドを使っても、見つから... ちゃっぴ 05/5/9(月) 9:47 回答[未読]
【24767】Re:Findメソッドを使っても、見つから... Kein 05/5/9(月) 10:08 回答[未読]
【24775】Re:Findメソッドを使っても、見つから... monmon 05/5/10(火) 5:56 お礼[未読]

【24763】Findメソッドを使っても、見つからな...
質問  monmon  - 05/5/9(月) 4:37 -

引用なし
パスワード
   またまたお願いします。前回の質問に関係するのですが…

シート"DataSet"のA列に時間データがあります。セルのフォーマットは"m/d/yyyy h:mm"で例えば"2/14/2005 11:04:23 AM”です。このようなデータが1000行まで20秒ごとにあります。このデータから処理の開始行と終了行をユーザーに指定させようとしています。そこで、以下のコードを使い、100行ごとの時間をコンボボックスにリストアップし、ユーザーが選択できるようにしました。

その後に選択された時間のセル番号を取得するために、Findメソッドを用いているのですが、どうしても見つかりません。

以下のコードの変数XXXを使わず、実際の日付・時間データを使うと見つけることができます。(ただし、LookIn:=xlFormulasを使った場合。LookIn:=xlValuesではだめ。)

どなたか、原因を教えてください…。

わかりにくい説明で申し訳ございません。

Private Sub UserForm_Initialize()
  Dim i As Integer
  Dim DateTime(10) As String

  For i = 0 To 1000 Step 100
  DateTime(i / 100) = Worksheets("DataSet").Range("A" & i).Value
  Next i
  
  ComboBox1.List = DateTime
  
  ComboBox1.ColumnHeads = True
  ComboBox2.ColumnHeads = True
End Sub

Private Sub CommandButton1_Click()

  Dim XXX As String
  
  XXX = UserForm.ComboBox1
    
  Sheets("DataSet").Select
  Set R = Columns("A:A").Find(XXX, SearchOrder:=xlByRows,_    LookIn:=xlFormulas, LookAt:=xlPart)
  If R Is Nothing Then
  MsgBox "Unable to Find"
    Exit Sub
  End If

  MsgBox "Cell No " & R.Address(0, 0) & Chr(13) & _
  "Cell Value " & R.Value & Chr(13) & _
  "Column No " & R.Column & Chr(13) & _
  "2nd Column " & R.Offset(0, 1).Value & Chr(10) & _
  "Row Name " & Split(R.Address, "$")(2)
End Sub

【24764】Re:Findメソッドを使っても、見つか...
回答  ウッシ  - 05/5/9(月) 8:57 -

引用なし
パスワード
   こんにちは

>DateTime(i / 100) = Worksheets("DataSet").Range("A" & i).Value
i = 0 の時に「Range("A" & i)」がエラーにならないですか?

>For i = 0 To 1000 Step 100
で「Range("A" & i).Value」を順番に入れているだけですから
「CommandButton1_Click」では「ComboBox1.Index」で行位置を逆算すればいいのでは?

【24765】Re:Findメソッドを使っても、見つか...
回答  ちゃっぴ  - 05/5/9(月) 9:47 -

引用なし
パスワード
   ▼monmon さん:
>またまたお願いします。前回の質問に関係するのですが…
>
> セルのフォーマットは"m/d/yyyy h:mm"で例えば"2/14/2005 11:04:23 AM”です。

ということは、日付・時刻型でCellには値が格納されていますね。

Excelで書式が日付・時刻型で格納される場合には、
Serial値で格納されています。
したがって、日付型で検索したほうがいいでしょう。

つまり、
>  Dim XXX As String

ではなく、Dim XXX As Date
としたほうがいいでしょうね。

> このようなデータが1000行まで20秒ごとにあります。

Sortされているのであれば、Findは非常に不効率です。
# 順次検索なので・・・

2分探索を利用してやると大幅なSpeed Upが望めるかと・・・

【24767】Re:Findメソッドを使っても、見つか...
回答  Kein  - 05/5/9(月) 10:08 -

引用なし
パスワード
   日付形式で入力されているなら、時間単位まで含めるとしてその値を CDblでDouble型
に変換し、Match関数の第一引数に渡します。また検索対象範囲をソートしていれば、
第三引数は 1 とします。

【24775】Re:Findメソッドを使っても、見つか...
お礼  monmon  - 05/5/10(火) 5:56 -

引用なし
パスワード
   みなさん、ありがとうございます。
無事解決しました。またよろしくお願いします。

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