Excel VBA質問箱 IV

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

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


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

【39961】配列から条件検索 aaa 06/7/4(火) 16:46 質問[未読]
【39962】Re:配列から条件検索 Jaka 06/7/4(火) 17:03 発言[未読]
【39966】Re:配列から条件検索 Kein 06/7/4(火) 17:12 回答[未読]
【40007】Re:配列から条件検索 aaa 06/7/5(水) 11:37 質問[未読]
【40011】Re:配列から条件検索 neptune 06/7/5(水) 13:52 回答[未読]
【40020】Re:配列から条件検索 Kein 06/7/5(水) 16:21 回答[未読]
【40025】Re:配列から条件検索 aaa 06/7/5(水) 17:03 質問[未読]
【40026】Re:配列から条件検索 Kein 06/7/5(水) 17:35 回答[未読]
【40060】Re:配列から条件検索 aaa 06/7/6(木) 13:54 お礼[未読]

【39961】配列から条件検索
質問  aaa  - 06/7/4(火) 16:46 -

引用なし
パスワード
   いつもお世話になっております。

今回は配列のデータに合致するものがあれば処理をするというものを作りたいと考えています。

具体的にご説明しますと、配列には休日の日付が入っています。
元データは設定ファイルで、「2005.12.23」「2006.01.01」のようになっており、設定ファイルからこの情報を読み込み配列に格納しました。
例えば

hai(1)=2005.12.23
hai(2)=2006.01.01

のような感じです。
入力された日付(A1)がこの配列に格納されている日付と同じなら休日とみなします。
ただしA1に入力される値は「2006/07/04」という形の日付データです。
元データと形式も違いますし、配列にあるデータと見比べるやり方がわかりません。
配列へのデータの入れ方は上記の方法でなくてもいいです。
例えば

Array(2005.12.23,2006.01.01・・・}

のような形式でも構いません。
よろしくお願い致します。

【39962】Re:配列から条件検索
発言  Jaka  - 06/7/4(火) 17:03 -

引用なし
パスワード
   私はこんな感じで処理してます。(要素数が5800?以内なら)
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=37;id=FAQ#146
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=1825;id=

【39966】Re:配列から条件検索
回答  Kein  - 06/7/4(火) 17:12 -

引用なし
パスワード
   Sub Ck_DaysAry()
  Dim CkSt As String
  Dim Ary As Variant
 
  If Not IsDate(Range("A1").Value) Then Exit Sub
  CkSt = Format(Range("A1").Value, "yyyy.mm.dd")
  Ary = Array("2005.12.23", "2006.01.01", "2006.07.04")
  If IsError(Application.Match(CkSt, Ary, 0)) Then
   MsgBox "その日付は休日ではありません", 48
  Else
   MsgBox "その日付は休日です", 64
  End If
End Sub

てな感じでしょーか。

【40007】Re:配列から条件検索
質問  aaa  - 06/7/5(水) 11:37 -

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

参考にさせていただき一度やってみたのですが、配列に取り込むところがうまくいかないせいで、マッチできません。
Keinさんに書いていただいた

>  Ary = Array("2005.12.23", "2006.01.01", "2006.07.04")

の箇所ですが、その値は変わることがあるので設定ファイルより読み込み変数に代入してこちらの配列に入れたいのです。
そこで下記のようにしました。

Dim strTEXT As String
Dim i As Integer
Dim j As Integer
Dim Ary As Variant
Dim onDate As String
 Worksheets("main").Activate
 onDate = Format(Worksheets("Sheet1").Range("B7").Value, "yyyy.mm.dd")
 Ary = ""
 j=31
 For i = 1 To j
  n = cnsKeyName & i
  '設定ファイルから読み込み(関数使用)
  strTEXT = FP_GetIniString(cnsAppName, n, cnsDefault, _
        ThisWorkbook.Path & cnsFileName)
  strTEXT = Format(strTEXT, "yyyy/mm/dd")
  Ary = Ary & "" & strTEXT & "" & ","
 Next i
 ' 結果の表示
 If Application.Match(onDate, Ary, 0) Then
  MsgBox "祝日です"
 Else
  MsgBox "祝日ではありません"
 End If

これだとうまくいくはずがありませんが、色々考えましたが結局わかりませんでした。
教えていただけませんか?

【40011】Re:配列から条件検索
回答  neptune  - 06/7/5(水) 13:52 -

引用なし
パスワード
   ▼aaa さん:
Keinさんではありませんが、
>  strTEXT = Format(strTEXT, "yyyy/mm/dd")
>  Ary = Ary & "" & strTEXT & "" & ","
失敗の原因ですが、これはVariant型の文字列で、配列にはなってません。
KeinさんのサンプルはArray関数で配列を作成しています。

従って、素直にAry を配列で宣言して、各要素にデータを代入してみてはどうでしょう。
(未検証です)

【40020】Re:配列から条件検索
回答  Kein  - 06/7/5(水) 16:21 -

引用なし
パスワード
   要するに"動的配列"に変更したい、ということですね ? それなら

>Dim Ary As Variant

Dim Ary() As String

として

For i = 1 To 31
  strTEXT = FP_GetIniString(cnsAppName, n, _
  cnsDefault, ThisWorkbook.Path & cnsFileName)
  strTEXT = Format(strTEXT, "yyyy/mm/dd")
  ReDim Preserve Ary(i)
  Ary(i) = strTEXT
Next i

と、配列に入れていけば良いと思います。マクロの最後で

Erase Ary

と、初期化することをお忘れなく。

【40025】Re:配列から条件検索
質問  aaa  - 06/7/5(水) 17:03 -

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

>要するに"動的配列"に変更したい、ということですね ?

そうです。
そこでKeinさんからいただいたコードで下記のように変更しました。
(一部抜粋しました)

Dim Ary() As String

For i = 1 To j
  n = cnsKeyName & i
  strTEXT = FP_GetIniString(cnsAppName, n, cnsDefault, _
       ThisWorkbook.Path & cnsFileName)
  strTEXT = Format(strTEXT, "yyyy/mm/dd")
  ReDim Preserve Ary(i)
  Ary(i) = strTEXT
Next i
'結果の表示
If Application.Match(onDate, Ary(i), 0) Then
 MsgBox "祝日です"
Else
 MsgBox "祝日ではありません"
End If
Erase Ary

すると
「型が一致しません。」とエラーが出ます。
どう対処したらよいのでしょうか?
また下記の方法も試しましたが、同様のエラーが出ます。

For i = 1 To j
 If Application.Match(onDate, Ary(i), 0) Then
  MsgBox "祝日です"
 Else
  MsgBox "祝日ではありません"
 End If
Next i

何度も何度もすいません。
お手数かけますが宜しくお願いします。

【40026】Re:配列から条件検索
回答  Kein  - 06/7/5(水) 17:35 -

引用なし
パスワード
   If IsError(Application.Match(onDate, Ary, 0)) Then
  MsgBox "祝日ではありません"
Else
  MsgBox "祝日です"
End If

と、修正して下さい。

【40060】Re:配列から条件検索
お礼  aaa  - 06/7/6(木) 13:54 -

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

こんにちは。
Keinさんのおっしゃるとおり直したらうまく動くようになりました。
助かりました。ありがとうございました。

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