2016-08-31 1 views
0

J'ai plusieurs feuilles et une des colonnes de la feuille contient une même colonne (dites "Noms"). Dans chacune des colonnes "Noms" se trouve une colonne "Statut" correspondante. Chaque colonne "Noms" peut contenir le même enregistrement d'une ou plusieurs feuilles. Si l'un des enregistrements dans la colonne "Statut" est mis à jour, je veux obtenir la valeur de la colonne "Noms" correspondante, puis rechercher toutes les feuilles, si elle a aussi le même enregistrement "Noms", je devrais pouvoir mettre à jour ses valeur "Status" correspondante basée sur la valeur de la première mise à jour "Status".excel - Mettre à jour plusieurs colonnes si une colonne de l'une des feuilles de travail est mise à jour

Maintenant, j'ai été en mesure de chercher une réponse à partir du web qui fonctionne (voir ci-dessous), le problème est que cela ne fonctionne que dans un sens. Je peux mettre à jour une valeur d'une feuille (par exemple sheet1) et il sera capable de mettre à jour une valeur d'une ou plusieurs feuilles de calcul. Mais lorsque j'ai essayé de mettre à jour une valeur d'une autre feuille de calcul (pas la feuille Sheet1), elle renvoie une erreur Method "Find' of object 'Range' failed.

Sample (cela devrait être dans chaque feuille de calcul, avec des colonnes, les noms de feuilles changé):

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Cells.Count > 1 Then Exit Sub 
Dim fn2 As Range 

If Not Intersect(Target, Range("B:B")) Is Nothing Then 
    Set fn2 = Sheets("Sheet1").Range("D:D").Find(Target.Offset(, -11).Value, , xlValues, xlWhole) 
    If Not fn2 Is Nothing Then 
     fn2.Offset(, 13) = Target.Value 
     MsgBox "A record has been updated name_tab tab" 
    End If 
End If 
End Sub 

S'il vous plaît aider. Merci.

Répondre

3

Vos erreurs de code parce que vous essayez de compenser 11 colonnes à gauche de la colonne D

édité après clarification OP sur:

  • à être utilisés pour des recherches en noms de feuille à coder en dur, car aucun modèle commun ne peut être trouvé pour les filtrer parmi toutes les autres feuilles de calcul

  • Names et Status colonnes ayant, en conséquence, des « noms » et en-têtes « d'état » dans la ligne 1 de chaque à être utilisés pour des recherches dans feuille

edited2 pour tenir compte de la première mise à jour index de la ligne (voir les lignes avec "****")

mettre ce code dans ThisWorkbook volet de code:

Option Explicit 

Const STATUSHEADER As String = "Status" 
Const NAMESHEADER As String = "Names" 


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Dim nameValue As String 
    Dim sht As Worksheet 
    Dim sheetNames As Variant 
    Dim firstUpdatedRowIndex As Long '<--| this will store first updated row index **** 

    If Not Proceed(Target) Then Exit Sub 

    sheetNames = Array("Sheet0001", "Sheet0002", "Sheet0003") '<--| fill array with sheets-to-be-searched names 

    On Error GoTo EXITSUB 
    Application.EnableEvents = False 

    nameValue = GetNameValue(Target) '<--| get value in the "Names" column corresponding row 
    For Each sht In Worksheets(sheetNames) '<--| loop through to-be-searched-in sheets 
     If sht.name <> Sh.name Then UpdateSheet sht, nameValue, Target.value, firstUpdatedRowIndex '**** 
    Next sht 

EXITSUB: 
    Application.EnableEvents = True 
End Sub 


Sub UpdateSheet(sht As Worksheet, nameValue As String, statusValue As Variant, firstUpdatedRowIndex As Long) '**** 
    Dim namesCol As Long, statusCol As Long 
    Dim f As Range 

    With sht '<--| refer to current to-be-searched-in sheet 
     With .Rows(1).SpecialCells(XlCellType.xlCellTypeConstants) '<--| refer to its 1st row non blank cells range 
      namesCol = FindFirstCell(NAMESHEADER, .Cells).Column '<--| get its "Names" column index 
      statusCol = FindFirstCell(STATUSHEADER, .Cells).Column '<--| get its "Status" column index 
     End With 
     Set f = FindFirstCell(nameValue, .Columns(namesCol).SpecialCells(XlCellType.xlCellTypeConstants)) '<--| search its "names" column for the "name" value corresponding to the changed "Status" in the originally changed sheet 
     If Not f Is Nothing Then '<--| if any matching cell found in "Names" column ... 
      .Cells(f.row, statusCol) = statusValue '<--| update its corresponding "Status" column value 
      MsgBox "record in row " & f.row & " has been updated in " & .name & " tab" 
      If firstUpdatedRowIndex = 0 Then firstUpdatedRowIndex = f.row '<--| store first updated row **** 
     End If 
    End With 
End Sub 


Function FindFirstCell(value As String, rng As Range) As Range 
    Set FindFirstCell = rng.Find(what:=value, lookat:=xlWhole, LookIn:=xlValues, MatchCase:=True) 
End Function 


Function GetNameValue(Target As Range) As String 
    With Target.Parent 
     GetNameValue = .Cells(Target.row, FindFirstCell(NAMESHEADER, .Range(.Cells(1, 1), .Cells(1, Target.Column - 1))).Column).value '<--| search columns preceeding the 'Target' (i.e.: "Status") one for the "Names" column and get its value at the row corresponding to changed "Status" one 
    End With 
End Function 


Function Proceed(rng As Range) As Boolean 
    Proceed = rng.Cells.Count = 1 '<--| proceed if only one changed cell 
    If Proceed Then Proceed = rng.Offset(-rng.row + 1) = STATUSHEADER '<--| proceed only if the changed cell is a "Status" column 
End Function 
+0

le problème est pour chaque feuille, la colonne des "noms" et "Status" varie. –

+0

et aussi, toutes les feuilles ne doivent pas être recherchées. il y a des feuilles sur le classeur qui ne devraient pas faire partie de la recherche. –

+0

Alors, quel est le modèle des positions des colonnes "Status" et "Names" sur les feuilles de calcul? Et comment détecter les feuilles de calcul où chercher? – user3598756