Comment faire correspondre plusieurs plages de valeurs de colonne à une ligne et save dans un autre location, en utilisant VBA?

Je suis bénévole auprès d'une ONG, aidant à créer une database SQL pour leurs données hebdomadaires sur la fréquentation des clients. Les données se trouvent actuellement dans une feuille de calcul Excel.

Je veux manipuler cette feuille de calcul pour éviter qu'ils ne changent leur process.

A propos de cette feuille de calcul: chaque ligne représente un client différent, tandis qu'une plage de 3 colonnes contient les informations suivantes (heure d'input, date d'expiration et unités) pour 5 jours de la semaine. Juste au-dessus du bloc in-units, est la date de service à laquelle cet set d'informations se rapporte (les dates sont normalement fusionnées sur cette plage, mais j'ai dû annuler la fusion). Une capture d'écran est ci-dessous pour reference

Capture d'écran de la feuille de calcul

Ce que j'ai besoin de faire: Je dois save chaque instance de la présence de chaque client sur une ligne séparée (dans un endroit différent – peut être sur la même feuille), correspondant à la date de service, l'heure, le time et les unités. le nom.

Ce que j'ai essayé: J'ai essayé de faire une boucle For... Next avec 3 counturs pour les 3 différentes gammes d'informations que j'ai besoin de searchr, et j'ai déclaré les counturs comme des gammes. Je ne suis pas sûr si While... Wend est plus approprié ici.

J'ai également essayé d'aller au tableau, mais cela ne se fait pas dans mon VBA.

Je me demandais également s'il existe un type de données datetime qui peut être appliqué à Excel pour éviter d'avoir à faire correspondre cette plage supplémentaire de valeurs au rest.

Note latérale: Les cellules grisées sur la feuille signifient que le client n'est pas prévu d'assister ce jour-là. Je dois donc inclure une instruction If pour ignorer les cellules vides.

Le code suivant fera ce dont vous avez besoin, assez pour vous aider à démarrer. Veuillez noter que j'ai deux feuilles, Feuille1 (où datatables sont stockées) et Feuille2 (où datatables sont déplacées)

J'ai mis les loops dans où r = ligne courante sur feuille1, c = colonne courante et alors x est le countur pour feuille2

r boucle commence à la ligne 3 et ne va qu'à 5 pour un exemple mais vous pouvez find la dernière ligne et changer la 5, ou utiliser une variable lastRow = .cells(.rows.count,1).end(xlup).row par exemple lastRow = .cells(.rows.count,1).end(xlup).row

Tout suppose que datatables sont toujours exactement dans le format indiqué dans votre capture d'écran. Vous pouvez réorganiser la sortie assez facilement dans les segments IF et END IF les plus internes

 Sub shift_me() Dim r As Long Dim c As Long Dim x As Long Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet2") x = 1 With ThisWorkbook.Worksheets("Sheet1") For r = 3 To 5 For c = 3 To 15 Step 3 If Not .Cells(r, c).Value2 = "" And Not .Cells(r, c).Value2 = 0 Then ws.Cells(x, 1).Value2 = .Cells(r, 1).Value2 ws.Cells(x, 2).Value2 = .Cells(r, 2).Value2 ws.Cells(x, 3).Value2 = .Cells(r, c).Value2 ws.Cells(x, 4).Value2 = .Cells(r, c + 1).Value2 ws.Cells(x, 5).Value2 = .Cells(r, c + 2).Value2 ws.Cells(x, 6).Value2 = .Cells(1, c).Value2 x = x + 1 End If Next c Next r End With End Sub