2011-06-23 11 views
0

VBAの新機能で、配列と範囲に問題があります。私はタイムスタンプを持つ値で作られた範囲の部分を選択し、それらを別の範囲で報告する関数を書く必要があります。VBAでの再分割とダイナミックレンジの貼り合わせ

範囲はこのようなものです:

  A   B 
1 15-May-11 23:47:40 False 
2 15-May-11 23:49:10 False 
3 15-May-11 23:49:10 False 
4 15-May-11 23:50:52 True 
5 15-May-11 23:50:52 False 
6 15-May-11 23:51:56 False 
7 15-May-11 23:51:56 True 
8 15-May-11 23:53:24 False 
9 15-May-11 23:53:24 False 

と私は、この機能を用意しています

Function selectEvents(rangeTimeValue, Val As String) 
    Dim outputRange() As Variant 
    j = 1 

    For i = 1 To rangeTimeValue.Height 
    Val_recorded = rangeTimeValue(i, 2).Value 
    Time_recorded = rangeTimeValue(i, 1).Value 
     If Val_recorded = Val Then 
      ReDim Preserve outputRange(j, 2) '(1) 
      outputRange(j, 1) = Time_recorded 
      outputRange(j, 2) = Val_recorded 
      j = j + 1 
     End If 
    Next i 

    selectEvents = Application.Transpose(outputRange) '(2) 
End Function 

は今、二つの問題があります。

  1. 機能ブレーク配列 は2回目の寸法が変更されます (1)
  2. 貼り付けの結果は(2) 範囲はI 推測する前に定義する必要がありますので、ときに私は、エラーを持っているが、私は、パラメトリックな方法
  3. 範囲の大きさを渡すために 方法を見つけるために管理していません

私は何か助けに感謝します、ありがとう!

+0

「rangeTimeValue」のタイプは何ですか? – jonsca

答えて

0

1のReDimは、あなたが Preserveキーワードをを使用する場合は、あなただけの最後の配列の次元

のサイズを変更することができVBAのヘルプから

を引用

を保持...あなたが最初の次元ReDim Preserveにしようとしている間。さらに、ReDim Preserveは高価な操作であり、絶対に必要な場合を除いて避けるべきです。これはあなたの場合ではありません。あなたの配列に含まれる要素の最大数を知ることができるので、コードの一番上にはReDimしかありません。

また、配列の下限を明示的に指定するのではなく、デフォルトの値となるようにすることをお勧めします。

これらのものの両方を行う方法の例:

Dim nVal As Long 
nVal = WorksheetFunction.CountA(rangeTimeValue.Columns(1)) 
ReDim outputRange(1 To nVal, 1 To 2) 

2.「貼り付け」の結果

あなたが何かを貼り付けていないので、私は、あなたがここで何を意味するかわからないんだけどどこでも。これはあなたがpas * * ingを意味するタイプミスですか?あるいは移調を意味しますか?私は.Transposeであなたがその行にしようとしていることを理解できません。知りません。私は暗闇の中で刺してみましょう:

あなたのシート上のどこかにあなたのoutputRange配列の内容を配置したい場合は、これはあなたがそれを行うことができる方法である:

Dim rngOutput As Range 
Set rngOutput = Sheet1.Range("G12") ' or wherever 
rngOutput.Resize(UBound(outputRange, 1), UBound(outputRange, 2)) _ 
    = outputRange 

ところで、outputRangeはあなたの配列のかなり恐ろしい名前です。それはRangeではないので、この名前は混乱につながる可能性があり、私はそれが本当にあなたのために行ったと思います。たとえば、それを電話しないでください。 Variantの配列であるため、varOutputが代わりに使用されます。

+0

ありがとうございますが、私は 'rngOutput.Resize(UBound(outputRange、1)、UBound(outputRange、2))= outputRange'の行にエラーがあり続けます ' –

+0

"エラー..."あなたと一緒に働くには、あなたですか?どのようなエラー、正確に? 'nVal'の値は何ですか?シートに置く直前に 'outputRange'の内容は何ですか?あなたはこの回答が役に立ったと思いますか? –

+0

申し訳ありませんが、私はちょうどそれを修正しました。上記のコードの変数の宣言に問題がありました。私は、事件が終わったと考えることができると思う。ありがとう! –

関連する問題