私は何も考えていないと言ってこれを覚えておきたい。なぜ自分のしていることをやっているのですか?私は本当にここにいるVBA指導者の一人が助けてくれることを願っています。また、これは私の最初の投稿ですので、私はルールに従うように最善を尽くしましたが、何か間違ったことがあった場合はそれを指摘してください。VBAの動的配列エラーの一部を複製する
私は、データの列を反復して配列を作成するサブを持っています。特定の値がすでに配列に含まれているかどうかを調べる関数を呼び出します。そうでない場合は、配列の寸法が変更され、値が挿入され、プロセスが再び開始され、リストの終わりに達するまで続きます。私は41個の値を合計した配列で終わるが、そのうちの4個は2回複製されているので、配列には37個の一意の値しかない。
私の人生では、これらの値を何が離れているのか、なぜそれらが重複しているのか理解できません。私は他の値が重複しているのを見なければならないと思ったが、私はそうではない。ここで
は、配列を作成し、サブのためのコードです:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
Dim bDimen As Byte, i As Long
On Error Resume Next
If IsError(UBound(arr, 2)) Then bDimen = 1 Else bDimen = 2
On Error GoTo 0
Select Case bDimen
Case 1
On Error Resume Next
IsInArray = Application.Match(stringToBeFound, arr, 0)
On Error GoTo 0
Case 2
For i = 1 To UBound(arr, 2)
On Error Resume Next
IsInArray = Application.Match(stringToBeFound, Application.Index(arr, , i), 0)
On Error GoTo 0
If IsInArray = True Then Exit For
Next
End Select
End Function
:
Sub ProductNumberArray(strWrkShtName As String, strFindColumn As String, blAsGrp As Boolean, iStart As Integer)
Dim i As Integer
Dim lastRow As Integer
Dim iFindColumn As Integer
Dim checkString As String
With wbCurrent.Worksheets(strWrkShtName)
iFindColumn = .UsedRange.Find(strFindColumn, .Range("A1"), xlValues, xlWhole, xlByColumns).Column
lastRow = .Cells(Rows.Count, iFindColumn).End(xlUp).row
For i = iStart To lastRow
checkString = .Cells(i, iFindColumn).Value
If IsInArray(checkString, arrProductNumber) = False Then
If blAsGrp = False Then
ReDim Preserve arrProductNumber(0 To j)
arrProductNumber(j) = checkString
j = j + 1
Else
ReDim Preserve arrProductNumber(1, 0 To j)
arrProductNumber(0, j) = .Cells(i, iFindColumn - 1).Value
arrProductNumber(1, j) = checkString
j = j + 1
End If
End If
Next i
End With
End Sub
そして、ここではcheckString
配列に値があるかどうかをチェックするコードです
何か助けを歓迎します。私は以前のすべての質問に対する答えを見つけ出すことができました(または少なくともデバッグして明らかな問題を見ることができました)が、これは私を困惑させました。私は誰かが何が起こっているのか理解できることを願っています。
ここ[EDIT]サブが呼び出されているコードである。
Sub UpdatePSI()
Set wbCurrent = Application.ActiveWorkbook
Set wsCurrent = wbCurrent.ActiveSheet
frmWorkbookSelect.Show
If blFrmClose = True Then 'if the user closes the selection form, the sub is exited
blFrmClose = False
Exit Sub
End If
Set wsSelect = wbSelect.Sheets(1)
Call ProductNumberArray("Forecast", "Item", True, 3)
wbCurrent
、wsCurrent
、及びblFrmClose
は、一般宣言で規定されています。
最初のサブがどのように呼び出されているかを示すコードを追加できますか? wbCurrentはどこにも定義されていないようです。その値が見つかった場合、なぜ配列が再寸法調整されるのですか?すでに値が存在する場合は、値を追加しないでください。 – SJR
あなたは別のリストを簡単に作成するのに使うことができる '.Exists'メソッドを持っているので、代わりに' Scripting Dictionary'を使うべきです。それは後で 'Array'に変換することができます – braX
@braX私の配列に2つの部分が必要な場合もあれば、1つしかない場合もあります。このようにして複数の場所で配列サブを再利用できます。私が「スクリプティングディクショナリ」と言うことから、私はそのことを許しません。 @SJR値が見つからない場合、関数は 'False'を返し、値が追加されます。値が見つかると、関数は 'True'を返し、' If'文はスキップされます。 – PrimeTurtler