- 05 Set 2020 às 16:15
#58484
Boa Tarde, amigos! Estou criando um DataSet para análise em Machine Learning, cujos dados originais estão em uma tabela do Excel. São efetuadas algumas operações tais como descobrir o maior valor na região selecionada, passagem da região para uma matriz em memória, ordenação e geração de uma segunda matriz contendo a quantidade de elementos repetidos na matriz original.
Até aí tudo funcionando 100%, mas não estou conseguindo "escrever" de volta os valores da matQtd na planilha, inciando na segunda linha vazia da coluna "A", após a matriz original (matOriginal).
Para fins de teste, usei uma matriz original pequena, com 2 linhas e 6 colunas, e valores entre 1 e 7, evitando criar uma matriz de quantidades muito grande.
Agradeço antecipadamente qualquer ajuda!
Obrigado,
Augusto Cesar
Até aí tudo funcionando 100%, mas não estou conseguindo "escrever" de volta os valores da matQtd na planilha, inciando na segunda linha vazia da coluna "A", após a matriz original (matOriginal).
Para fins de teste, usei uma matriz original pequena, com 2 linhas e 6 colunas, e valores entre 1 e 7, evitando criar uma matriz de quantidades muito grande.
Agradeço antecipadamente qualquer ajuda!
Obrigado,
Augusto Cesar
Código: Selecionar todos
Sub ContaQuantidade()
Dim rg As Range
Dim matOriginal As Variant
Dim i, j, temp As Long
Dim linAtual, colAtual As Long
Dim ultLinha As Long
Dim ultColuna As Long
Dim maiorValor As Long
' Obtém o número de linhas e colunas na matriz original
Set rg = Planilha1.Range("A1").CurrentRegion
ultLinha = rg.Rows.Count
ultColuna = rg.Columns.Count
' Pesquisa qual o maior valor dentro da região nomeada como rg
maiorValor = 0
For i = 1 To ultLinha
For j = 1 To ultColuna
If rg.Cells(i, j) > maiorValor Then
maiorValor = rg.Cells(i, j)
End If
Next j
Next i
' Carrega para a matriz em memória os valores da região
matOriginal = Planilha1.Range("A1").CurrentRegion.Value
' Ordena ascendentemente cada linha da matriz usando o método bolha
For linAtual = 1 To ultLinha
For i = 1 To ultColuna - 1
For j = i + 1 To ultColuna
If matOriginal(x, i) > matOriginal(x, j) Then
temp = matOriginal(x, i)
matOriginal(x, i) = matOriginal(x, j)
matOriginal(x, j) = temp
End If
Next j
Next i
Next linAtual
' Exibe cada linha da matriz ordenada ascendentemente (apenas para conferência)
For i = 1 To ultLinha
For j = 1 To ultColuna
Debug.Print matOriginal(i, j) & " ";
Next j
Debug.Print " "
Next i
For i = 1 To ((ultColuna * 2) - 1)
Debug.Print "-";
Next i
Debug.Print ""
' Cria uma segunda matriz com as dimensões do número de linhas da matriz original
' e o número de colunas sendo o maior valor encontrado na matriz originall
ReDim matQtd(ultLinha, maiorValor) As Variant
' Preenche a matriz criada com zeros
For i = 1 To ultLinha
For j = 1 To maiorValor
matQtd(i, j) = 0
Next j
Next i
' Ajustar cada Linha do Vetor de Quantidades para as quantidades encontradas em matOriginal
For linAtual = 1 To ultLinha
For colAtual = 1 To ultColuna
matQtd(linAtual, matOriginal(linAtual, colAtual)) = matQtd(linAtual, matOriginal(linAtual, colAtual)) + 1
Next colAtual
Next linAtual
' Exibe a matriz de quantidades (apenas para conferência)
For i = 1 To ultLinha
For j = 1 To maiorValor
Debug.Print matQtd(i, j) & " ";
Next j
Debug.Print " "
Next i
For i = 1 To ((ultColuna * 2) - 1)
Debug.Print "-";
Next i
' Seleciona a célula A1
Planilha1.Range("A1").Select
' Localiza a primeira célula vazia na coluna "A"
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Wend
' Desloca-se para uma segunda linha vazia abaixo da encontrada na operação acima
ActiveCell.Offset(1, 0).Select
'
' Escrever os valores da matriz matQtd na região que inicia-se
' na célula anteriormente selecionada
'
' Aqui é que está a minha dificuldade:
' Qual a forma correta de escrever matQtd a partir da segunda célula vazia na coluna "A"?
'
' ActiveCell.Offset(1, 0).Value = matQtd ' Desta forma só escreve um valor
' Range("A10:F16").Value = matQtd
End Sub