Pergunta

Eu tenho um 2 variável tabela de dados 100x100 em excel.

Eu preciso ter uma função que retorna todos os possíveis conjuntos de variáveis ??que produzem um determinado valor alvo. O que estou vendo é uma espécie de uma função de pesquisa dimensional reursive 2. Alguém pode me apontar na direção certa?

Foi útil?

Solução

Pode ser feito sem VBA, bastante compacta, assim.

Suponha que a sua mesa de 100x100 é em B2: CW101, e colocamos uma lista de números de 1 a 100 para baixo a esquerda, de A2 para A101, e novamente 1 a 100 na parte superior de B1 para CW1

Criar uma coluna de células por baixo, começando (digamos) na B104

 B104=MAX(($A$2:$A$101*100+$B$1:$CW$1<B103)*($B$2:$CW$101=TargetValue)*($A$2:$A$101*100+$B$1:$CW$1))

Esta é uma fórmula de "array", então pressione Ctrl-Shift-Enter em vez de Enter e chaves {} deve aparecer em torno da fórmula.

Em seguida, copie para baixo por tantas linhas como você pode precisar. Você também precisa colocar um grande número acima de sua primeira fórmula, ou seja, em B103, por exemplo 999999.

O que a fórmula faz é calcular Rowx100 + Coluna, mas apenas para cada célula bem sucedido, e a função MAX encontra o maior resultado, excluindo todos os resultados anteriores encontrados, ou seja, ele encontra os resultados alvo um de cada vez, começando de baixo direito e trabalhando até superior esquerdo. (Com um pouco de esforço você pode obtê-lo a procurar outro caminho).

Isto lhe dará resultados como 9922, que é linha 99, coluna 22, e você pode facilmente extrair esses valores a partir do número.

Espero que isso faz sentido.

Outras dicas

Não há built-in função que irá fazer o que quiser, eu estou 99% certo disso.

função Um VBA que retorna uma matriz pode ser construída, ao longo das linhas do Sub rápida e suja já mostrado. Criar um Variant para segurar o resultado, talvez Redimmed ao número máximo possível de resultados e Redim Preserve-d para baixo para o número real no final. Em seguida, retornar que, como o resultado da função que então precisa ser chamado como uma função de matriz (Control-Shift-Enter).

Um ponto negativo é que você tem que garantir que a meta era grande o suficiente para segurar o resultado completo:. Excel não vai fazer isso automaticamente

Eu tentei muito isso sem usar VBA, mas não parece ser possível sem ele. Para resolver este problema, que eu precisava para percorrer toda a matriz e encontrou valores mais próximos. Estes valores foram então derefernced usando chamadas e propriedades de intervalo ea saída foi gerada em um intervalo que está sendo incrementado a cada partida válida.

A implementação rápida e suja é como abaixo:

Dim arr As Range
Dim tempval As Range
Dim op As Integer

Set arr = Worksheets("sheet1").Range("b2:ao41")
op = 1
Range("B53:D153").ClearContents





For Each tempval In arr
If Round(tempval.Value, 0) = Round(Range("b50").Value, 0) Then

Range("b52").Offset(op, 0).Value = Range("a" & tempval.Row).Value
Range("b52").Offset(op, 1).Value = Cells(tempval.Column, 1).Value
Range("b52").Offset(op, 2).Value = tempval.Value
op = op + 1

End If

Next
Range("b50").Select

Eu ainda estou procurando uma abordagem sem VBA.

Eu tenho uma solução que não usa VBA, mas é bastante confuso. Ela envolve a criação de uma tabela mais unidimensional no Excel e fazendo pesquisas sobre isso. Para uma tabela de dados de 100x100, a nova tabela precisaria de 10.000 linhas.

Desculpas se isso não atender às suas necessidades.

Um resumo está abaixo - deixe-me saber se você precisa de mais detalhes. N = a dimensão dos dados, v.g. 100 no seu exemplo.

Em primeiro lugar, criar uma nova tabela com cinco colunas e linhas NxN. Em cada caso, substitua meus nomes de coluna com a referência Excel apropriado

A primeira coluna (chamemos-lhe INDEX) simplesmente listas 1, 2 ... NxN.

A segunda coluna (datarow) contém uma fórmula para percorrer 1, 2 ... N, 1, 2 ... N ... Isto pode ser feito usando algo parecido = MOD (INDEX-1, N) + 1

A terceira coluna (DATACOL) contém 1, 1, 1 ... 2, 2, 2 ... (N vezes cada). Isto pode ser feito com = INT ((INDEX-1) / N) 1

A quarta coluna (VALUE) contém o valor de sua tabela de dados, usando algo como: = OFFSET ($ A $ 1, DataRow, DATACOL), assumindo sua tabela de dados começa em $ A $ 1

Agora temos uma tabela unidimensional realização de todos os seus dados.

A quinta coluna (PROC) contém a fórmula: = FÓSFORO (alvo, OFFSET (VALUERANGE, [PROC-1], 0), 0) + [PROC-1]

onde [PROC-1] se refere à célula imediatamente acima (por exemplo, na célula F4 esta refere-se a F3). Você precisará de um 0 acima da primeira célula na coluna de pesquisa.

VALUERANGE deve ser um (nomeado ou usando $ sinais) de referência fixo para toda a coluna de valor.

A coluna de pesquisa, em seguida, detém números de índice que podem ser usadas para procurar datarow e DATACOL para encontrar a posição do jogo nos dados.

Isso funciona, à procura de fósforos em VALUERANGE, em seguida, à procura de jogos em uma faixa ajustada começando depois do jogo anterior.

É muito mais fácil em uma planilha, em seguida, através da explicação acima, mas isso é o melhor que posso fazer no momento ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top