VBA Excel: Função para encontrar uma string em outra pasta de trabalho


1

Eu estou tentando criar uma função que procura uma seqüência de caracteres (bom) em duas pastas de trabalho diferentes e retorna um valor próximo a essa seqüência de caracteres. Conheço os intervalos nessas pastas de trabalho em que desejo realizar a pesquisa e, em seguida, uso o deslocamento para obter o valor. No entanto, a função retorna um erro #VALUE.

Eu criei funções de pesquisa antes, mas somente dentro da mesma pasta de trabalho, esta é a primeira usando pastas de trabalho diferentes. Talvez você possa me ajudar a encontrar um erro na minha lógica:

Option Explicit

Function findhscode(bom As String)

Dim base1 As Workbook
Dim base2 As Workbook


base1 = Workbooks.Open("path1")
base2 = Workbooks.Open("path2")

If Not base1.Sheets("Sheet1").Range("myRange").Find(bom) Is Nothing Then
    findhscode= base1.Sheets("Sheet1").Range("myRange").Find(bom).Offset(0, -7).value
    Else
        If Not base2.Sheets("Sheet1").Range("myRange").Find(bom) Is Nothing Then
        findhscode = base2.Sheets("Sheet1").Range("myRange").Find(bom).Offset(0, 1).value
            Else
            findhscode= "Please contact Imports for assistance"
        End If
End If

End Function

Atribuindo Objetos base1 e base2 sem Set trabalho?
week

Eu adicionei "set" mas ainda não está funcionando
Ruben

Respostas:


1

Eu tentei o seu código. Para fazê-lo funcionar, você precisa - como semana sugere - definir as variáveis ​​base1 e base2. Caso contrário, você receberá um:

Variável de objeto ou Com variável de bloco não definida erro.

Também ajudaria (embora não esteja causando o problema) se você atribuísse o tipo de retorno na função. Como não há nenhum tipo de retorno explícito, o padrão é Objeto. A única outra coisa em que consigo pensar é se você tem caminhos literais para base1 e base2 ou se está usando variáveis. Se variáveis, remova as aspas.

O seguinte código funcionou para mim (com um par MessageBox adiciona para dar algumas informações de depuração):

Function findhscode(bom As String)

Dim base1 As Workbook
Dim base2 As Workbook


Set base1 = Workbooks.Open("c:\temp\book1.xlsx")
Set base2 = Workbooks.Open("c:\temp\book2.xlsx")

  If Not base1.Sheets("Sheet1").Range("MyRange").Find(bom) Is Nothing Then
    MsgBox "found in base1"
    findhscode = base1.Sheets("Sheet1").Range("MyRange").Find(bom).Offset(0, 1).Value
    Else
        If Not base2.Sheets("Sheet1").Range("MyRange").Find(bom) Is Nothing Then
        MsgBox "found in base2"
        findhscode = base2.Sheets("Sheet1").Range("MyRange").Find(bom).Offset(0, 1).Value
            Else
            MsgBox "not found"
            findhscode = "Please contact Imports for assistance"
        End If
End If 

Eu chamei isso de um simples subbox inputbox:

Sub stringPrompt()
  Dim hs As String
  hs = InputBox("String to search for", vbOKOnly, "Search String")
  Range("A1") = findhscode(hs)
End Sub

Nota: a mensagem de erro #Value geralmente indica um erro de tipo de dados. Você verificou que não está tentando fazer um cálculo matemático com dados de texto?

Também (só porque você menciona o valor requerido é 'próximo a essa string'). Sua primeira chamada offset é de sete colunas para a esquerda dessa string.


Olá, eu addet Set base1 mas nada mudou, os caminhos são literais não variáveis, não estou realizando cálculos ani também. A tentativa de usar a função, digitando = findhscode () em uma célula e, em seguida, selecionando a célula que eu quero procurar. Em relação ao offset 0, -7, está tudo bem, porque nessa pasta de trabalho o intervalo contendo os dados está à esquerda.
Ruben

Ahhhh, UDFs. Eu não acho que isso seja possível. De office.microsoft.com/pt-pt/excel-help/… : ..., funções personalizadas não podem redimensionar janelas; edite uma fórmula em uma célula; ou altere as opções de fonte, cor ou padrão para o texto em uma célula. Código "action" desse tipo em um procedimento de função, retorna o valor #VALUE! erro.
mcalex
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.