Remplir les entrées manquantes d'une feuille à l'autre

0

J'ai deux feuilles dans Excel. Pour cet exemple, feuille 1 et feuille 2.

Feuille 1 : 100 enregistrements avec prénom , Emplacement , Le sexe

Feuille 2 : 100 enregistrements avec prénom , Emplacement , Âge

Les sources des données ne sont pas synchronisées. Par conséquent, j'ai dans la feuille 1 des données qui n'existent pas dans la feuille 2, mais dans la feuille 2, des données qui n'existent pas dans la feuille 1 et dans des données les deux feuilles. Il se peut donc que certains noms de la feuille 1 ne figurent pas dans la feuille 2 et inversement.

Je recherche un moyen automatisé de regrouper les deux feuilles dans une troisième feuille et de renseigner le champ Nom & amp; Lieu et disponibilité, âge et sexe. Je sais que ce serait facile à faire dans MS Access, mais en raison de mon auditoire, je dois garder cela dans Excel et je suis un vrai malentent à VBA: S

Ce que j'ai fait : Sur la feuille 3, j'ai créé des formules pour extraire les données de la feuille 1 et dans la feuille 2, j'ai ajouté un champ ("X"), que la formule apposera sur le champ avec "1" si le champ n'est pas présent dans la feuille. 1 et indiquera "0" si le champ est présent dans la feuille 1. Dans mon esprit, je cherche un moyen qui indique: "Si le champ" X "dans la feuille 2 =" 1 ", extrait ces données. et l'ajouter à la feuille 3, mais je ne sais pas comment faire :(

stemar805
la source
2
Bienvenue sur Super User. Malheureusement, nous ne sommes pas un service d’écriture de code. Au lieu de simplement demander du code pour effectuer une tâche particulière, montrez-nous ce que vous avez essayé jusqu'à présent (y compris le code que vous avez actuellement) et les endroits où vous êtes bloqué afin que nous puissions vous aider à résoudre votre problème spécifique. Les questions qui ne demandent que du code sont trop larges et risquent d’être mis en attente ou fermé . Lisez s'il vous plaît Comment puis-je poser une bonne question? .
DavidPostill
David je m'excuse. Je n'ai pas utilisé de code pour cela, je suis seulement allé aussi loin que le tutoriel "Hello World". Ce que j'ai fait: Sur la feuille 3, j'ai créé des formules pour extraire les données de la feuille 1 et dans la feuille 2, j'ai ajouté un champ, lequel sera étiqueté avec "1" si le champ n'est pas présent dans la feuille 1. et indiquera "0" si le champ est présent dans la feuille 1. Dans mon esprit, je cherche un moyen qui indique: "Si le champ" X "dans la feuille 2 =" 1 ", extrait ensuite ces données et ajoutez-le à la feuille 3, mais je ne sais pas comment faire :( Est-ce toujours trop général?
stemar805
essayer de rechercher megre tables excel et vous trouverez quelque chose comme ceci: digdb.com/excel_add_ins/join_merge_tables_lists Et maintenant, il vous suffit de modifier le code. (Utilisez concat de deux champs pour la recherche)
befzz
Peut-être les convertir en tables et ensuite utiliser des formules? Je ne sais pas, ce serait facile avec VBA. Recherchez le superutilisateur pour consolider les données avec vba, je suis sûr que vous trouverez quelque chose.
Raystafarian
@ Raystafarian, j'ai fait cette recherche & amp; found @ Ajedi32 a fourni cette réponse il y a deux ans et demi: Accédez à l'onglet de données du ruban, cliquez sur "À partir d'autres sources", puis sur "À partir de Microsoft Query". Cliquez ensuite sur Fichiers Excel, sélectionnez le fichier dans lequel vous travaillez actuellement. Cliquez sur OK. Ensuite, appuyez sur Annuler & amp; lorsqu’on vous demande si vous souhaitez continuer à éditer dans Microsoft Query, cliquez sur "Oui". À partir de là, vous pouvez cliquer sur le bouton SQL & amp; écrire une requête SQL personnalisée sur n’importe quelle feuille de la feuille de calcul. Dans mon cas: SELECT * FROM 'Sheet1 $' ` 'Sheet1$' UNION SELECT * DE 'Sheet2$' `'Sheet2 $'` `
stemar805

Réponses:

0

cela nécessiterait un script VBA pas si difficile.

Voici le pseudo code

Create Array that contains All Names from Sheet B
For i = 0 to CellFromACount
 IF A.Name is not in ArrayB
   SheetB.AddLine (Item)
Next

Pour écrire le code, suivez quelques tutoriels en cherchant Excel vba tutorial sur un moteur de recherche. Exemple ici: Tutoriel VBA

Les choses dont vous avez besoin faire sont:

  1. Tableau de cordes
  2. Obtenir de la valeur de la cellule
  3. Pour boucle
  4. Si condition
  5. Ajouter une nouvelle ligne en bas de la feuille
Xavier
la source
Merci pour cela, très apprécié. J'espère que grâce à ces conseils, je saurai quoi rechercher et pourra apprendre à "pêcher".
stemar805
1
Ce n'est pas une réponse. Il ne fournit pas d'instructions ou de code sur la façon d'accomplir la tâche. Il fait référence à des éléments extérieurs sans fournir de résumé. Et il suggère à l'utilisateur Google pour les réponses.
Raystafarian
@ Raystafarian, convenu que ce n'est pas une réponse, mais la personne m'a dit quel type de code dont j'ai besoin pour accomplir la tâche. Je leur témoignais mon appréciation pour qu'ils me dirigent dans la bonne direction. :)
stemar805
En fait, il fournit une solution sur la façon d'accomplir la tâche et un résumé de tout ce qu'il doit faire pour obtenir une solution. Je ne pense pas que l'objectif était d'écrire un tutoriel de 10 pages comme réponse
Xavier
@Raystafarian Il fournit l'aide et le chemin correct pour une réponse. Même si cela n’aide en rien les références futures de l’aspect "wiki" de StackExchange, il aide toujours l’utilisateur à lui donner le bon chemin à suivre, pour quelque chose d'aussi simple. Parfois, les gens peuvent tout comprendre par eux-mêmes :)
Gil Sand
0

Cela devrait marcher. Mettre dans un module :

Public Sub sheetmerge()
Dim wkb As Workbook
Dim wks, wks1, wks2 As Worksheet
Set wkb = ThisWorkbook
Set wks = wkb.Sheets(1)
Set wks1 = wkb.Sheets(2)
Set wks2 = wkb.Sheets(3)
emptyRow1 = False
i = 1
k = 1
' Loops while there is data on sheet 1 column 1
While emptyRow1 = False
    found = False
    ' extracts the name from column 1, row i
    name1 = wks.Cells(i, 1)
    If name1 <> "" Then
        'As it is not empty then loop through Sheet2 names
        emptyRow2 = False
        j = 1
        While emptyRow2 = False
            name2 = wks1.Cells(j, 1)
            If name2 <> "" Then
                'As name2 is not empty then compare name and name 2
                If name1 = name2 Then
                    'If name1 is the same as name2 then put the data on Sheet3
                    wks2.Cells(k, 1) = name1
                    wks2.Cells(k, 2) = wks.Cells(i, 2)
                    wks2.Cells(k, 3) = wks.Cells(i, 3)
                    wks2.Cells(k, 4) = wks1.Cells(j, 3)
                    found = True
                    k = k + 1
                    'stop looping sheet2 by setting emptyrow2 to True
                    emptyRow2 = True
                End If
            Else
                'name2 is empty, then stop looping sheet2
                emptyRow2 = True
            End If
            j = j + 1
        Wend
    Else
        'name1 is empty then stop looping Sheet1
        emptyRow1 = True
    End If
    'if after looping there was no coincidence of names then put the data from Sheet1
    If found = False Then
        If name1 <> "" Then
            wks2.Cells(k, 1) = name1
            wks2.Cells(k, 2) = wks.Cells(i, 2)
            wks2.Cells(k, 3) = wks.Cells(i, 3)
            k = k + 1
        End If
    End If
    i = i + 1
Wend
'This area loops through Sheet2 seeking for coincidences
emptyRow2 = False
j = 1
While emptyRow2 = False
    found = False
    name2 = wks1.Cells(j, 1)
    If name2 <> "" Then
        emptyRow1 = False
        i = 1
        While emptyRow1 = False
            name1 = wks.Cells(i, 1)
            If name1 <> "" Then
                If name2 = name1 Then
                    found = True
                    emptyRow1 = True
                End If
            Else
                emptyRow1 = True
            End If
            i = i + 1
        Wend
    Else
        emptyRow2 = True
    End If
    ' If there wasn't a coincidence it means this name is in sheet2 but is not on Sheet1 so, put it in Sheet3.
    If found = False Then
        wks2.Cells(k, 1) = name2
        wks2.Cells(k, 2) = wks1.Cells(j, 2)
        wks2.Cells(k, 4) = wks1.Cells(j, 3)
        k = k + 1
    End If
    j = j + 1
Wend
End Sub

Il boucle à travers les lignes sur feuille1 les mettre feuille3 mettre une quatrième colonne s'il y a une coïncidence avec feuille2 .

Après ça passe en boucle feuille2 mettre sur feuille3 lignes non trouvées sur feuille1 .

jcbermu
la source
Merci beaucoup. J'ai trouvé une réponse hier, mais je vais vérifier si cela fonctionne aujourd'hui (je respecte les délais). C'est toujours bon de connaître plus d'une façon de faire quelque chose! Merci encore pour votre temps et votre aide!
stemar805
Cela a fait un excellent travail, mais a ajouté des doublons. J'ai vraiment besoin d'apprendre ce code. Merci mille fois!
stemar805
Je suis à peu près sûr que ce qui suit est la partie qui identifie les champs. Pouvez-vous me dire comment je peux / suis supposé changer cela pour qu'il puisse regarder le titre à la deuxième ligne? Mes feuilles ont en réalité 135 colonnes et les informations sont dispersées :( wks2.Cells(k, 1) = name1 wks2.Cells(k, 2) = wks.Cells(i, 2) wks2.Cells(k, 3) = wks.Cells(i, 3) wks2.Cells(k, 4) = wks1.Cells(j, 3)
stemar805
J'ai ajouté quelques commentaires au code pour le rendre plus clair. Si vos informations commencent sur la deuxième ligne, changez les lignes i=1 et j=1 à ì=2 et j=2. Le code suppose que les données des deux feuilles se trouvent dans les colonnes 1, 2 et 3. Il pourrait être très difficile de les rechercher sur 135 colonnes.
jcbermu