2017-07-25 4 views
0

Ich versuche, einen Code, in dem ein Eingangsbild I nach der Überprüfung der Informationen in jedem Blatt meiner Arbeitsmappe zu schreiben. Da ich für jeden zu dem Code hinzugefügt, um es stoped arbeiten und begann mir diese Kompilierung Fehlermeldung geben, funktioniert der Code ohne die For Each, aber ich mag es automatisch sein. Kann u Jungs helfen?Compile Fehler: Argument nicht optional Excel VBA

DE: Ich versuche, zusammen einen Code zu setzen, wo sie alle Blätter überprüft und fügt das Bild als die Daten in einer bestimmten Zelle. Der Code funktioniert ohne die Schleife, sondern wollen, dass es vollständig automatisiert und zur Verfügung gestellt werden, dass die For Each enthält diese Zusammenstellung Fehler angezeigt. Wenn Sie mir dabei helfen kann, ist es dankbar.

Sub ForEachWs() 
Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Worksheets 
    Call Worksheet_SelectionChange 
    Next ws 

End Sub 

Sub Worksheet_SelectionChange(ByVal Target As Range) 

    On Error Resume Next 

    If Target.Column = 2 And Target.Row = 1 Then ' onde clicar para buscar imagem 

     BuscarImagemTavares (Target.Value) 

    End If 

End Sub 

Sub BuscarImagemTavares(Produto As String) 
    On Error Resume Next 
    'Autor: Tavares 

    If Range("B2") = "ok" Then 'Verifica se celula B2 tem ok se sim não insere a imagem novamente 
    Exit Sub 
    End If 

    Dim Imagem, CaminhoImagem As String 

    If Len(Produto) = 3 Then 'acrescenta 00 antes do cod do produto 
     Produto = "00" & Produto 
    End If 
    If Len(Produto) = 4 Then 'acrescenta 0 antes do cod do produto 
     Produto = "0" & Produto 
    End If 

    Imagem = Dir("\\Clfssrvfar\ENGENHARIA\GESTAO_DE_PROJETOS\04. FOLLOWUP\09. ARQUIVOS PARA FERRAMENTAS\09.1 IMAGENS\09.1.2 IMAGENS PRODUTOS\" & Produto & "*", vbDirectory) 

    CaminhoImagem = "\\Clfssrvfar\ENGENHARIA\GESTAO_DE_PROJETOS\04. FOLLOWUP\09. ARQUIVOS PARA FERRAMENTAS\09.1 IMAGENS\09.1.2 IMAGENS PRODUTOS\" & Imagem 



    With ActiveSheet.Pictures.Insert(CaminhoImagem) 'Mostra Imagem 
     'Define tamanho e posição da imagem 

    With .ShapeRange 
     .Width = 75 
     .Height = 115 
     .Top = 7 
     .Left = 715 
     '*above it's me trying to make white background transparent* 
      'With .PictureFormat 
      '.TransparentBackground = True 
      '.TransparencyColor = RGB(255, 0, 0) 
      'End With 
     '.Fill.Visible = True 
     'End With 
     'ActiveSheet.Shapes.Range(Array("Picture 2")).Select 
     'Application.CommandBars("Format Object").Visible = False 
    End With 
    End With 
    If CaminhoImagem <> "" Then 'Após inserir imagem informa "ok" na B2 para não inserir de novo 
    Range("B2").Select 
    ActiveCell.FormulaR1C1 = "OK" 
    End If 

End Sub 
+1

sollten Sie versuchen, die Frage in Alemán zu schreiben. Wenn Sie nicht sicher sind, wie, mit dem Übersetzer und jemand wird die möglichen Fehler bearbeiten. –

+0

Не става така тука. – Vityata

+0

Es u gehen, jetzt Alemão. –

Antwort

0

Da Sie die Unter BuscarImagemTavares für jedes Arbeitsblatt, das Sie haben ausführen möchten, müssen Sie die U-Boote verändern.

ForEachWs:

Sub ForEachWs() 
    Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Worksheets 
     'Here you can directly call the sub without the sub Worksheet_SelectionChange 
     Call BuscarImagemTavares(ws, ws.Cells(1,2).Value) 
     'in BuscarImagemTavares you´ll need the ws reference to actually work on the right worksheet (otherwise youll always work on the selected one) 
    Next ws 

End Sub 

BuscarImagemTavares:

Sub BuscarImagemTavares(ByVal ws as Worrksheet, Produto As String) 
    'Mind the additional parameter 'ws' 
    On Error Resume Next 
    'Autor: Tavares 

    'If Range("B2") = "ok" Then 'Verifica se celula B2 tem ok se sim não insere a imagem novamente 
    If ws.Range("B2") = "ok" Then 'Here you actually have to use a reference to the Worksheet you want to use, otherwise alwys the same will be used 
     Exit Sub 
    End If 

    ... 

    'You need the reference here as well so you won#t use the same worksheet over and over again 
    With ws.Pictures.Insert(CaminhoImagem) 'Mostra Imagem 

    ... 

    If CaminhoImagem <> "" Then 'Após inserir imagem informa "ok" na B2 para não inserir de novo 
     'Range("B2").Select 
     'ActiveCell.FormulaR1C1 = "OK" 
     'If you don´t actually need the cell in excel to be selected after the programm finished you should´nt use the '.select' and '.selection' instead use this: 
     ws.Range("B2").Value= "OK" 'Since you aren´t adding a formula you should address the '.value' property 
    End If 

    ... 

End Sub 

wünsche ich Ihnen ein wenig helfen könnte.

+0

Duuuuuude, vielen Dank, es ist jetzt workig, ich wünsche, dass ich den Koks kaufen konnte u! –

+0

Sie sind willkommen :) – FatTony

0

Sie rufen die Ereignis-Routine Sub Worksheet_SelectionChange. Dies ist eine Routine que aus Excel automatisch aufgerufen wird, wenn der Benutzer auf die ausgewählte Zelle (bewegliche Cursor) ändert. Es ist erlaubt, die Ereignisroutine, die von Hand zu nennen, aber Sie müssen die range die Parameter übergeben (die den Bereich, der ausgewählt wurde), zum Beispiel:

For Each ws In ActiveWorkbook.Worksheets 
    Call Worksheet_SelectionChange(ws.cells(1,2)) 
Next ws 

Dieser den Compiler zufrieden stellen wird, aber warum nicht Aufruf der realen Routine direkt: both ForEachWs und BuscarImagemTavares

For Each ws In ActiveWorkbook.Worksheets 
    Call BuscarImagemTavares (ws.cells(1,2).value) 
Next ws 
+0

Yep es funktioniert, Alkohol Also, das Problem ist, dass es jetzt in jedem Blatt all Bilder in einem Bogen statt ein Bild inputing. –

+0

Dies liegt daran, dass Sie auf dem Active-Objekt arbeiten. Entweder legen Sie die ws.activate vor dem Anruf (schlecht) oder das gesamte Arbeitsblatt die Parameter übergeben und daran arbeiten. Ich habe gerade angefangen, den Code zu ändern, aber FatTony war schneller ... – FunThomas

+0

Geck Sie viel srsly geholfen, danke! Es ist workig jetzt. –