Usuário com melhor resposta
PROCURA VALOR EM LUGARES DISTINTOS

Pergunta
-
Boa tarde!
Preciso fazer uma busca de valores da seguinte forma.Comparar o valor da Plan 1 coluna F com a plan 2 nas colunas G J M P a partir da linha 4.
e trazer para plan1 coluna O o titulo das colunas G J M P ( que está na linha 3 )onde foi encontrado o numero mais aproximado do procurado.
Respostas
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double 'PREENCHE TODAS AS POSIÇÕES DA MATRIZ COM O VALOR 1 MILHÃO For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 'PERCORRE A COLUNA F DA PLANILHA1 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").Range("F" & Rows.Count).End(xlUp).Row + 1 'SE A CÉLULA DA COLUNA F NÃO ESTIVER EM BRANCO If ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" Then 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 'LINHA3 VAI CONTAR AS LINHAS DA MATRIZ DE DIFERENÇAS LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 'LINHA VAI CONTAR AS LINHAS DA PLANILHA2 LINHA = 4 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'VAI PARA PRÓXIMA COLUNA DA PLANILHA2 Next K 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2) - 1).Value End If 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 sexta-feira, 17 de novembro de 2017 14:26
- Marcado como Resposta CS_RODRIGO sexta-feira, 17 de novembro de 2017 16:01
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double 'PREENCHE TODAS AS POSIÇÕES DA MATRIZ COM O VALOR 1 MILHÃO For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 'PERCORRE A COLUNA F DA PLANILHA1 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").Range("F" & Rows.Count).End(xlUp).Row + 1 'SE A CÉLULA DA COLUNA F NÃO ESTIVER EM BRANCO If ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" Then 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 'LINHA3 VAI CONTAR AS LINHAS DA MATRIZ DE DIFERENÇAS LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 'LINHA DA PLANILHA2 LINHA = 2 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'VAI PARA PRÓXIMA COLUNA DA PLANILHA2 Next K 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2)).Value End If 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 sexta-feira, 17 de novembro de 2017 16:39
- Marcado como Resposta CS_RODRIGO sexta-feira, 17 de novembro de 2017 17:47
Todas as Respostas
-
-
Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 quarta-feira, 15 de novembro de 2017 20:44
-
Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 quarta-feira, 15 de novembro de 2017 20:44
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double ' A PARTIR DA LINHA 2 LINHA2 = 2 'PERCORRE A COLUNA F DA PLANILHA1 While ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 LINHA = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA, 2) = K End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA, 2) = K End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA, 2) = K End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA N = DIFERENCA(4, 1) INDICE = 4 For L = 4 To LINHA - 1 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If Next L Next K 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA 'MENOS 1, POIS É A COLUNA ANTERIOR 'JÁ QUE O VALOR ESTÁ NAS COLUNAS 7, 10, 13, 16 'E O TÍTULO ESTÁ NAS COLUNAS 6, 9, 12, 15 ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2) - 1).Value 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 LINHA2 = LINHA2 + 1 Wend End Sub
ESSE CÓDIGO JOGA OS TÍTULOS DAS COLUNAS F, I, L , O
Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 quarta-feira, 15 de novembro de 2017 20:36
- Editado AndersonFDiniz2 sexta-feira, 17 de novembro de 2017 00:40
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double ' A PARTIR DA LINHA 2 LINHA2 = 2 'PERCORRE A COLUNA F DA PLANILHA1 While ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 LINHA = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA, 2) = K End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA, 2) = K End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA, 2) = K End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA N = DIFERENCA(4, 1) INDICE = 4 For L = 4 To LINHA - 1 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If Next L Next K 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2)).Value 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 LINHA2 = LINHA2 + 1 Wend End Sub
ESSE CÓDIGO JOGA OS TÍTULOS DAS COLUNAS G, J, M, PAnderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 quarta-feira, 15 de novembro de 2017 20:44
-
Anderson,
Em geral é isso que preciso, mas ainda não atendeu porque mesmo eu alterando os valores a rotina me traz só o titulo do KIT A quando na verdade logo a primeira linha deveria ser KIT B.
Outro detalhe, eu conseguira criar uma variável para determinar até que linha ele deve executar.
porque eu vi que está rodando até o fim do arquivo ou seja enquanto for <> "" mas como puxo esses valores de varias fontes com uma serie de se procv as vezes tenho uma linha vazia e na sequencia um valor mas a rotina já foi encerrada.
Nessa variável de baixo pra cima encontraria a primeira célula diferente de vazio gravaria o numero da linha e executaria a partir da linha 2 até o valor da variável.coloquei duas imagens que retratam os casos citados.
-
Outra coisa , seria mais simples eu renomear a célula que está com o sub total como kit A kit B kit C kit D e fazer as busca da mesma forma, mas apenas nas células com os sub total e traria o nome da célula ou conteúdo de celula abaixo com o offiset(1,0).select onde ele achou o valor mais aproximado .
Mesmo tendo linhas em vazias na coluna F plan1 eu busco na plan2 até a ultima linha realmente mas só nos sub totais por exemplo....
Algo que você mesmo tinha questionado no inicio. segue imagens
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").UsedRange.Rows.Count 'PERCORRE A COLUNA F DA PLANILHA1 ' While ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 LINHA = 4 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA Next K N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2) - 1).Value 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 'LINHA2 = LINHA2 + 1 'Wend Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 sexta-feira, 17 de novembro de 2017 00:33
-
Anderson certamente irei marcar como resposta.
Porém, segue conforme informei ontem.
Tenho linhas vazias no meio da coluna F q impossibilita da rotina ir até o fim realmente, quando acha uma linha vazia por a rotina é interrompida.
A questão de puxar apenas um kit foi resolvido está puxando o kit correto conforme o valor encontrado.Com toda sua experiencia, não seria melhor trabalhar a busca apenas com o total?
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").Range("F" & Rows.Count).End(xlUp).Row + 1 'PERCORRE A COLUNA F DA PLANILHA1 ' While ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 LINHA = 4 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA Next K N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2) - 1).Value 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 'LINHA2 = LINHA2 + 1 'Wend Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").Range("F" & Rows.Count).End(xlUp).Row + 1 'PERCORRE A COLUNA F DA PLANILHA1 ' While ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" 'O VALOR PROCURADO ESTÁ NA COLUNA F If ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" Then NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 LINHA = 4 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA Next K N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2) - 1).Value 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 'LINHA2 = LINHA2 + 1 'Wend End If Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double 'PREENCHE TODAS AS POSIÇÕES DA MATRIZ COM O VALOR 1 MILHÃO For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 'PERCORRE A COLUNA F DA PLANILHA1 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").Range("F" & Rows.Count).End(xlUp).Row + 1 'SE A CÉLULA DA COLUNA F NÃO ESTIVER EM BRANCO If ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" Then 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 'LINHA3 VAI CONTAR AS LINHAS DA MATRIZ DE DIFERENÇAS LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 'LINHA VAI CONTAR AS LINHAS DA PLANILHA2 LINHA = 4 'ENQUANTO HOUVER VALOR NA COLUNA While ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value <> "" 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'PASSA PARA A PRÓXIMA LINHA NA PLANILHA2 LINHA = LINHA + 1 Wend 'VAI PARA PRÓXIMA COLUNA DA PLANILHA2 Next K 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2) - 1).Value End If 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 sexta-feira, 17 de novembro de 2017 14:26
- Marcado como Resposta CS_RODRIGO sexta-feira, 17 de novembro de 2017 16:01
-
Anderson, PERFEITO!
PARABÉNS POR TODO CONHECIMENTO E PROATIVIDADE.
Se caso eu precise procurar os números da planilha1 coluna F em relação ao valor total invés de percorrer as colunas como na resposta anterior eu percorrer apenas as células separadas em preto G2 J2 M2 e devolver o texto a baixo G3 J3 M3 onde a diferença para o valor procurado for menor.
Segue imagem.
-
Option Explicit Sub VALORMAISPROXIMO() Dim K, INDICE As Integer Dim LINHA, LINHA2, LINHA3 As Long Dim NUMERO, NUMERO2, N, L As Double ' NA COLUNA 1 DA MATRIZ FICA A DIFERENÇA ENTRE O VALOR PROCURADO 'E OS VALORES EXISTENTES NA PLANILHA2 'NA COLUNA 2 DA MATRIZ FICA A COLUNA EM QUE ESTÁ O VALOR DA PLANILHA2 Dim DIFERENCA(4 To 100000, 1 To 2) As Double 'PREENCHE TODAS AS POSIÇÕES DA MATRIZ COM O VALOR 1 MILHÃO For LINHA = 4 To 100000 DIFERENCA(LINHA, 1) = 1000000 Next LINHA ' A PARTIR DA LINHA 2 'PERCORRE A COLUNA F DA PLANILHA1 For LINHA2 = 2 To ThisWorkbook.Sheets("Planilha1").Range("F" & Rows.Count).End(xlUp).Row + 1 'SE A CÉLULA DA COLUNA F NÃO ESTIVER EM BRANCO If ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value <> "" Then 'O VALOR PROCURADO ESTÁ NA COLUNA F NUMERO = ThisWorkbook.Sheets("Planilha1").Range("F" & LINHA2).Value 'A PARTIR DA LINHA 4 'LINHA3 VAI CONTAR AS LINHAS DA MATRIZ DE DIFERENÇAS LINHA3 = 4 'PERCORRE AS COLUNAS 7, 10, 13, 16 DA PLANILHA2 For K = 7 To 16 Step 3 'LINHA DA PLANILHA2 LINHA = 2 'NUMERO2 É O VALOR QUE ESTÁ NA PLANILHA2 NUMERO2 = CDbl(ThisWorkbook.Sheets("Planilha2").Cells(LINHA, K).Value) 'SE O NUMERO2 FOR MAIOR QUE O NÚMERO PROCURADO If NUMERO2 > NUMERO Then ' A DIFERENÇA VAI SER O NUMERO2 MENOS O NÚMERO PROCURADO DIFERENCA(LINHA3, 1) = NUMERO2 - NUMERO 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR MENOR QUE O NÚMERO PROCURADO If NUMERO2 < NUMERO Then ' A DIFERENÇA VAI SER O NÚMERO PROCURADO MENOS O NUMERO2 DIFERENCA(LINHA3, 1) = NUMERO - NUMERO2 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'SE O NUMERO2 FOR IGUAL AO NÚMERO PROCURADO If NUMERO2 = NUMERO Then 'A DIFERENÇA É IGUAL A ZERO DIFERENCA(LINHA3, 1) = 0 'NA COLUNA 2 DA MATRIZ, FICA O NÚMERO DA COLUNA DO NUMERO2 DIFERENCA(LINHA3, 2) = K LINHA3 = LINHA3 + 1 End If 'VAI PARA PRÓXIMA COLUNA DA PLANILHA2 Next K 'APÓS COLOCAR NA MATRIZ TODAS AS DIFERENÇAS 'VAI VERIFICAR QUAL É A MENOR DIFERENÇA 'OU SEJA, QUAL VALOR ESTÁ MAIS PRÓXIMO 'N VAI GUARDAR A MENOR DIFERENÇA N = DIFERENCA(4, 1) INDICE = 4 L = 5 While DIFERENCA(L, 1) <> 1000000 If DIFERENCA(L, 1) < N Then N = DIFERENCA(L, 1) INDICE = L End If L = L + 1 Wend 'NA COLUNA O DA PLANILHA1 'ESCREVE O VALOR DA LINHA 3 PLANILHA2 'DE ACORDO COM A COLUNA DA MENOR DIFERENÇA ThisWorkbook.Sheets("Planilha1").Range("O" & LINHA2).Value = ThisWorkbook.Sheets("Planilha2").Cells(3, DIFERENCA(INDICE, 2)).Value End If 'PASSA PARA A PRÓXIMA LINHA DA COLUNA F DA PLANILHA1 Next LINHA2 End Sub
A MELHOR FORMA DE AGRADECER E VOTAR COMO UTIL OU MARCAR COMO RESPOSTA Anderson Diniz diniabr2011@gmail.com
- Sugerido como Resposta AndersonFDiniz2 sexta-feira, 17 de novembro de 2017 16:39
- Marcado como Resposta CS_RODRIGO sexta-feira, 17 de novembro de 2017 17:47
-