4

私は自分でこの問題を理解しようとしましたが、おそらく私がどのように機能するかについて誤解していることがありArrayUniqueます。

LotusScriptのサンプルコードは次のとおりです。

'Let's test some dates
dateOne = CDat("12/16/2010")
dateTwo = CDat("12/16/2010")
testSuccess = (dateOne = dateTwo)

'On evaluation, testSuccess = true
        
'Now let's make an array ...
Dim someArray(1) As Variant
someArray(0) = dateOne
someArray(1) = dateTwo
uniqueArray = ArrayUnique(someArray)

'uniqueArray has the same two elements ... the duplicate hasn't been removed

上記の例では、dateOne、dateTwo、testSuccess、uniqueArrayはすべて暗黙的に宣言されたバリアント変数です。

私は何が間違っているのですか?私はそれが言うところのヘルプを読みました:

使用法

バリアント配列の要素は、同じタイプの場合にのみ同等に比較されます。バリアント配列にクラスまたはオブジェクトを含めることはできません。

null値を含む配列要素は、他のnull値と一致します。

空の配列要素は、空の他の要素と一致します。

この例のバリアント配列には、日付/時刻タイプのバリアント変数が含まれています。ですから、これを正しく読んでいれば、何も悪いことはしていません。

編集:Notesフォーラムで、ユーザーThoamsKennedyは次のことを試みました。

このように時間要素を綴ると

dateOne = CDat( "12/16/2010 04:20:17 AM")

dateTwo = CDat( "12/16/2010 04:20:17 AM")

それでも、それらは別個のものとして扱われます。ミリ秒のコンポーネントはないように思われるので、ArrayUniqueはDateTimeバリアントの処理方法を知らないと思います。

したがって、彼の結論は、ArrayUniqueうーん、機能しないということです。

4

2 に答える 2

2

まあ、これはうまくいきます:

%REM
    Function ArrayUniqueStringCompare
    Since ArrayUnique doesn't seem to work in some cases (such as with date/time values),
    Let's convert all of the elements to string and then perform arrayunique.
    After performing unique, we can convert back to original type
    This will crash if sourceArray is not an array.
%END REM
Function ArrayUniqueStringCompare(sourceArray As Variant) As Variant
    typeOfElement$ = TypeName(sourceArray(0))
    upperLimitSource% = UBound(sourceArray)
    Dim stringArray() As String
    ReDim stringArray(upperLimitSource%)
    For i% = 0 To upperLimitSource%
        stringArray(i%) = CStr(sourceArray(i%))
    Next
    'Now get the unique values...
    uniqueArray = ArrayUnique(stringArray)
    upperLimitUnique% = UBound(uniqueArray)
    'Finally, convert the values back to their original data type
    Dim returnArray() As Variant
    ReDim returnArray(upperLimitUnique%)
    For i% = 0 To upperLimitUnique%
        If typeOfElement$ = "DATE" Then
            returnArray(i%) = CDat(uniqueArray(i%))
        End If
    Next
    ArrayUniqueStringCompare = returnArray
End Function

しかし、確かにこれは最善の解決策ではありませんよね?ArrayUniqueを機能させるためのより良い方法があるはずです...

于 2010-12-16T19:30:22.820 に答える
2

いくつかのテストを行いましたが、ArrayUniqueはLSデータ型7(日付/時刻)を処理できないようです。内部的には、日付タイプはdoubleとして格納されるため、doubleとの間で変換して、これを機能させることができます。

例えば:

'Now let's make an array ... 
Dim someArray(1) As Variant 
someArray(0) = Cdbl(dateOne)
someArray(1) = Cdbl(dateTwo)
uniqueArray = ArrayUnique(someArray)

uniqueArrayには要素が1つだけあります。

または、日付値を割り当てる前に、dateOneとdateTwoをDoubleとしてDimすることもできますが、これも問題なく機能するようです。

于 2010-12-17T01:37:55.083 に答える