简体   繁体   English

Vba 嵌套的 do while 循环创建矩阵

[英]Vba nested do while loops to create a matrix

I am trying to get the code to fill the matrix on the right with the sum values from the table on the left.我试图让代码用左边表格中的总和值填充右边的矩阵。 The code is skipping the first iteration and only running one column.该代码跳过第一次迭代,只运行一列。

Before前

After后

Sub CreatingMatrix()
    Cc = 15
    Cr = 6
    Pr = 6
    Sr = 6
    Mr = 6
    Mc = 15
    ii = 15
    i = 6

    Do While Cells(5, ii) <> ""
        ii = ii + 1
        T3C = Cells(5, Cc)
        T1C = Cells(Cr, 2)

        Do While Cells(i, 14) <> ""
            i = i + 1
            T3P = Cells(Pr, 14)
            T1P = Cells(Pr, 1)

            If (T3C = T1C) And (T3P = T1P) Then
                Rank = Cells(Sr, 5).Value
                Cells(Mr, Mc).Value = Rank
            End If
            Mr = Mr + 1
            Sr = Sr + 1
            Pr = Pr + 1
        Loop

        Mc = Mc + 1
        Cc = Cc + 1
        Cr = Cr + 1
    Loop

End Sub

3 loops, 3 counters but very inefficient. 3 个循环,3 个计数器但效率很低。

Sub CreatingMatrix()

    Dim i As Long, x As Long, y As Long
    i = 6
    Do While Cells(i, "A") <> ""

        x = 15 ' O
        Do While Cells(5, x) <> ""
            y = 6
            Do While Cells(y, "N") <> ""
                If Cells(i, "A") = Cells(y, "N") And _
                    Cells(i, "B") = Cells(5, x) Then
                    Cells(y, x) = Cells(i, "E")
                    Exit Do
                End If
                y = y + 1
            Loop
            x = x + 1
        Loop
        i = i + 1
        
    Loop

End Sub

I used the pivot table suggestion with some extra code.我使用了带有一些额外代码的 pivot 表建议。


Sub PivotTableWithValues()
'Declare Variables
Dim PSheet As Worksheet
Dim DSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PRange As Range
Dim LastRow As Long
'Dim 3 As Long

'Insert a New Blank Worksheet
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("PivotTable").Delete
Sheets.Add Before:=ActiveSheet
ActiveSheet.Name = "PivotTable"
Application.DisplayAlerts = True
Set PSheet = Worksheets("PivotTable")
Set DSheet = Worksheets("Data")

'Define Data Range
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Set PRange = DSheet.Cells(5, 1).Resize(LastRow, 5)

'Define Pivot Cache
Set PCache = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=PRange). _
CreatePivotTable(TableDestination:=PSheet.Cells(2, 2), _
TableName:="ValuesTable")

'Insert Blank Pivot Table
Set PTable = PCache.CreatePivotTable _
(TableDestination:=PSheet.Cells(1, 1), TableName:="SalesPivotTable")

'Insert Row Fields
With ActiveSheet.PivotTables("ValuesTable").PivotFields("Class")
.Orientation = xlRowField
.Position = 1
End With

'Insert Column Fields
With ActiveSheet.PivotTables("ValuesTable").PivotFields("People")
.Orientation = xlColumnField
.Position = 1
End With

'Insert Data Field
With ActiveSheet.PivotTables("ValuesTable").PivotFields("Total")
.Orientation = xlDataField
.Function = xlSum
.NumberFormat = "#,##0"
.Name = "Class Matrix"
End With

With ActiveSheet.PivotTables("ValuesTable")
.ColumnGrand = False
.RowGrand = False
End With

'Format Pivot Table
    ActiveSheet.PivotTables("ValuesTable").ShowDrillIndicators = False
    ActiveSheet.PivotTables("ValuesTable").DisplayFieldCaptions = False
ActiveSheet.PivotTables("ValuesTable").ShowTableStyleRowStripes = True
ActiveSheet.PivotTables("ValuesTable").TableStyle2 = "PivotStyleLight1"




'Sheets("PivotTable").Range("B3", Cells(LastRow, LastCol)).Copy
'Sheets("Data").Range("Q5").Paste
''Sheets("Data").PasteSpecial xlPasteValues


Worksheets("PivotTable").PivotTables("ValuesTable").TableRange2.Copy
Worksheets("Data").Range("Q5").PasteSpecial xlPasteValues

Application.DisplayAlerts = False
Sheets("PivotTable").Delete
Application.DisplayAlerts = True

End Sub

Then to get multiples然后得到倍数

Sub MatrixSize()
Dim LastColumn As Long, LastRow As Long, LastRowG As Long
    Dim i As Long
    Dim rng As Range
    Dim FinClass As Range
Dim ValuesRange As Range
Dim NumClass As Integer

LastCol = Cells(5, Columns.Count).End(xlToLeft).Column
LastRow = Cells(Rows.Count, 17).End(xlUp).Row
LastRowG = Cells(Rows.Count, 7).End(xlUp).Row

i = 5
'from the first class Ta total to the last
Do Until Cells(i, "G") = ""
TestValue = Cells(i, "G")

'Find the number of times the value shows
Set rng = Range(Cells(7, "Q"), Cells(LastRow, "Q"))
NumClass = WorksheetFunction.CountIf(rng, TestValue)

'if numclass is not the correct value paste more
If NumClass <> Cells(i, "H") Then
'find the location of the Te
Set FinClass = Range(Cells(7, "Q"), Cells(LastRow, "Q")).Find(What:=TestValue) '.Address
'copy the row that contains the test values from it to the final column
  
'r = Range(FinClass, Cells(FinClass.Row, Cells(FinClass.Row, Columns.Count).End(xlToLeft).Column)).Copy

   iCol = Cells(FinClass.Row, Columns.Count).End(xlToLeft).Column - FinClass.Column + 1
    If iCol < 1 Then iCol = 1
    Set FinClass = FinClass.Resize(1, iCol)
FinClass.Copy Destination:=Cells(LastRow, "Q")

LastRow = LastRow + 1

Else
'test next value
i = i + 1
End If

Loop
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM