Bom dia
Meu objetivo é criar uma lista que cresça horizontalmente (por colunas). A Tabela 1 tem cinco colunas e um número de linhas sujeitas a aumento, (coluna A-tarefa principal), (coluna B-sub-tarefa), (coluna C- recurso 1 para realizar a tarefa),(coluna D- recurso 2 para realizar a mesma tarefa),(coluna E- recurso 3 para realizar a mesma tarefa). NB: Cada tarefa principal pode ter várias subtarefas, se for o caso, várias células (para a tarefa principal) serão mescladas para corresponder a várias subtarefas correspondentes à tarefa principal.
A Tabela 2 contém uma lista de todos os recursos listados na coluna A. Esses recursos podem ter/não ter aparecido na Tabela 2 (coluna C/D/E), ou seja, atribuídos a uma subtarefa/tarefa principal.
O código que tenho destina-se a pesquisar cada recurso na tabela 1, pesquisando tarefas e subtarefas às quais está atribuído e gerando esses resultados conforme mostrado na imagem.
O plano na criação do código é: O código deve usar nomes de recursos na coluna A-Tabela 2 como um índice, use-o para procurar o recurso na tabela 1 na primeira coluna, se encontrar uma correspondência, então valor de saída no mesa. E continua a procurar o mesmo recurso e saída se o encontrar. Em seguida, procure o mesmo recurso na próxima coluna e depois na próxima.
Uma vez terminada a busca pelo recurso aa, ele procura pelo recurso bb na coluna c, depois d e, por fim, na última. Inserindo valores de resultados à medida que avança.
Sua ajuda em modificar o que tenho é muito apreciada.
No código abaixo, as tabelas da tabela estão em planilhas diferentes. Isso é bom e pode ser implementado também.
Sub SearchResourceNames()
'Declare variables
Dim ws1 As Worksheet, ws2 As Worksheet
Dim r As Range, c As Range, i As Long, j As Long, k As Long
Dim resource As String, task As String, col As Long
'Set the worksheets
Set ws1 = ThisWorkbook.Sheets("Table1")
Set ws2 = ThisWorkbook.Sheets("Table2")
'Initialize variables
i = 2
j = 2
k = 2
col = 2
'Loop through the resources in table 2
For Each r In ws2.Range("A1:A10")
'Get the resource name
resource = r.Value
'Initialize flag to indicate if task has been found
found = False
'Loop through the tasks in table 1
For Each c In ws1.Range("A:A")
'If the resource is found in the current task,
If c.Value = resource Then
'Set the flag to indicate that the task has been found
found = True
'Get the task name
task = c.Offset(0, col).Value
'If the task has not been found before,
If Not ws2.Range("B" & k).Value = task Then
'Add the task name to the output column
ws2.Range("B" & k).Value = task
'Increment the output column index
k = k + 1
End If
End If
Next c
'If the task was not found in any of the tasks,
If Not found Then
'Print a message to the user
MsgBox "The resource " & resource & " was not found in any of the tasks."
End If
Next r
'Move to the next column in table 2
col = col + 1
'Reset the output column index
k = 2
End Sub
Dados e saída desejada:
Saída atual indesejada
Eu sugeriria criar um Dicionário de todos os recursos. Cada entrada nesse Dicionário de recurso obtém novamente um Dicionário de todas as tarefas das quais o recurso precisa cuidar.
Somente após a construção do Dicionário completo, ele será despejado na planilha de resultados.
Se você não estiver familiarizado com Dicionários: Há muita documentação por aí, por exemplo aqui . Observe que estou usando ligação antecipada, portanto, você deve adicionar uma referência ao Microsoft Scripting Runtime.
O código para construir o dicionário de recursos é bastante direto. Por motivos de velocidade, primeiro leio os dados completos
Table1
em uma matriz bidimensional (chamei-a dedata
). Em seguida, o código percorre todas as linhas de todas as colunas de recursos e lê o nome do recurso. Se não estiver no dicionário (é "novo"), criamos um novo Dicionário (taskDict
) para a entrada. Em seguida, a tarefa é adicionada ao Dicionário de tarefas e o recurso é adicionado ao Dicionário de recursos.Agora tudo o que resta fazer é chamar esta função e preencher o resultado na tabela2:
dados de transformação