OOPではなくOffice、Excel、Visual Basicを使用する理由 上記のこれらの質問にはすでに部分的に回答しています。 また、この選択は、このアルゴリズムが記述されている会社の詳細と、Officeが社内のすべての研究マネージャーが使用するメインソフトウェアであるという事実によって決定されると言うこともできます。
このようなタスクは純粋に適用され、データ分析の方法の1つを使用するときに常に発生します。
与えられた :
- 「データ」シートには、要素数が不明な不定次元のマトリックスがあります。
- マトリックスの各列の長さ(つまり、列内の要素の数)は事前にわかりません。
- 確率の高い列Nの長さは、列N + 1の長さと列N-1の長さと一致しません。
- すでに形成されたマトリックスの特定の列の長さは時間とともに変化しないことが知られています。
- 行列の行の長さは常に同じであることが知られています。
- マトリックスの各要素が要素の値を持つ1つのセルに対応するように、マトリックスはExcelテーブルに表示されます。 このような行列を「初期条件の行列」と呼びます。
タスク: 「res」シートに、初期条件のマトリックスの要素の組み合わせのすべてのバリアントを相互に作成します。 マトリックスの値の1つは、 X回以上繰り返されるべきではありません。
さて、アルゴリズム自体はExcell 2010でテストされた作業スクリプトであり、できるだけシンプルで明快に記述しようとしました。
Dim RangeArray() As Integer Dim PositionArray() As Integer Dim ResultArray() As Integer MaxCombination = 3 ' . PresentValue = 1 ' , , , . MaxYSize = 0 ' . IterationCounter = 1 ' res. CombinationCounter = 0 ' . MaxIterationCoutner = 1 ' . PreviousIterationCounter = 0 ' , . WorkAreaXSize = Selection.Columns.Count ' . ReDim RangeArray(WorkAreaXSize) ReDim PositionArray(WorkAreaXSize + 1) ReDim ResultArray(WorkAreaXSize) RangeArray(0) = 1 ' . For Each Column In Selection.Columns ' RangeArray, . Column.SpecialCells(xlCellTypeConstants).Select WorkAreaYSize = Selection.Cells.Count If WorkAreaYSize > MaxYSize Then MaxYSize = WorkAreaYSize End If RangeArray(Column.Column) = WorkAreaYSize Next ' RangeArray Range(Cells(1, 1), Cells(MaxYSize, WorkAreaXSize)).Select ValueArray = Selection ' , . , , PositionArray , RangeArray , . ' , , . - , - . For i = 1 To WorkAreaXSize PositionArray(i) = 1 Next i For i = 1 To WorkAreaXSize ' , , i . For e = 1 To i ' , - . MaxIterationCoutner = MaxIterationCoutner * RangeArray(e) ' . Next e For y = 1 To MaxIterationCoutner ' ResultArray() PositionArray() If PreviousIterationCounter < y Then ' , . For j = 1 To WorkAreaXSize ResultArray(j) = ValueArray(PositionArray(j), j) ' ResultArray() PositionArray() If ResultArray(j) = PresentValue Then CombinationCounter = CombinationCounter + 1 ' PresentValue, MaxCombination End If Next j ' ResultArray(), ' ResultArray() res IterationCounter If CombinationCounter <= MaxCombination Then For d = 1 To WorkAreaXSize Sheets("res").Cells(IterationCounter, d).Value = ResultArray(d) Next d IterationCounter = IterationCounter + 1 ' End If End If CombinationCounter = 0 ' . if . PositionArray(1) = PositionArray(1) + 1 ' PositionArray, . , RangeArray() PositionArray() For ErrorCorrections = 1 To WorkAreaXSize If PositionArray(ErrorCorrections) > RangeArray(ErrorCorrections) Then PositionArray(ErrorCorrections) = 1 'If IterationCounter <= MaxIterationCoutner Then ' , PositionArray . ToDo , , PositionArray 1, , . PositionArray(ErrorCorrections + 1) = PositionArray(ErrorCorrections + 1) + 1 ' End If End If Next ErrorCorrections Next y PreviousIterationCounter = MaxIterationCoutner ', . MaxIterationCoutner = 1 ' For s = 1 To WorkAreaXSize PositionArray(s) = 1 Next s Next i '
マクロと初期条件のマトリックスのバリアントを含むスクリプト:
どんなコメントや建設的な批判も歓迎します。