Ingénieur calcul dans le bâtiment, j'utilise régulièrement des macros VBA pour réaliser des calculs itératifs et des opérations répétitives au sein d'Excel.
Mais j'ai désormais un besoin plus complexe, et après avoir regardé différents tutos, je ne comprends pas comment m'y prendre. J'aimerais donc savoir s'il est possible de faire en VBA ce que je veux faire, si oui, je me remettrai à chercher comment.
J'ai un fichier excel, courbes.xlsm
Il est situé à : C:/_Calculs/
Il contient un onglet nommé : courbes
Dans cet onglet se trouvent 208 courbes de la forme suivant : une colonne abscisse une colonne ordonnées (dans ce cas précis, de la ligne 2 à la ligne 722)
En spoiler les premières lignes de quelques courbes pour illustration :
s P1O0 s P1O1 s P1O2 s P1O3 s P1O4 s P1O5 ...
000000000000101079101041101229101621101889101003204105204345204824206254207106203847307045307218308277301083030119883068964010177409982401102740141864016883401130450131045012979501475050184725021847501494960159086016368601797260228766026684601840270185347019283702181270283657032162702195480214878022406802467680321938036495802552790241499025015902807090364919041221902797910027110100279921003081210040663100452441003198911028466110315321103535711048812110520061103397612030124120347811203948312054463120562181203358813032934130379231304337113060195130620371303345814035623140412371404660414064306140653291403989615039262150440861504969715068424150717431504592016041093160472281605364216074480160754721603924517042506170497061705679017078004170765951703531018044107180521441805993018082245180791261803905719049421190560441906315819084955190828031904287120052957200598192006714620078667200791122004432721052570210619392106839021083805210847322104973922054704220648852207118422083173220901062205646223057686230671482307357323081590230928192306566724060636240701202407541624076533240903102408564125064804250723282507539125084319250924922508940326066651260743332607658026082271260943642601000002706764227077285270800882708996727097477270977142806994328078084280789942808430328010000028010000029072268290802982908085829095970290100000290100000300760373008130430077834300100000300100000300100000
...
Mon objectif serait :
- créer un fichier nommé comme la cellule B1 (ligne 1 col 2) (avec ou sans extension de fichier, peut importe)
- copier-coller dedans le contenu des cellules A2:B722 (ligne 2 col 1 à ligne 722 col 2)
- sauvegarder et fermer le fichier créé
- incrémenter de deux colonnes 207 fois pour avoir un total de 208 fichiers.
A la main c'est fastidieux, et juste relou ^^
Est-ce possible en VBA ?
Merci d'avance.
11/07/2018, 12h14
Menhir
C'est plus rapide d'écrire le code que d'expliquer comment faire.
Donc :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Dim WSSource As Worksheet, WSDest As Worksheet
Dim WBSource As Workbook, WBDest As Workbook
Dim Col AsLongSet WSSource = ActiveSheet
Set WBSource = ActiveWorkbook
Set WBDest = Workbooks.Add
Set WSDest = ActiveSheet
For Col = 1To WSSource.Cells(1, Columns.Count).End(xlToLeft).Column Step2
WSSource.Cells(1, Col).Resize(1, 2).EntireColumn.Copy WSDest.Range("A1")
WBDest.SaveAs FileName:=WBSource.Path & "\" & WSSource.Cells(1, Col + 1).Value
WSDest.Columns("A:B").ClearContents
Next Col
WBDest.Clos
Par contre, c'est du code tapé à l'arrache directement sur le forum et non testé. Je te laisse donc faire un éventuel débugage.
11/07/2018, 13h26
MatthieuB_
Merci beaucoup !
Une petite modification m'a permis de supprimer la première ligne de chaque fichier.
Sub Modifiee()'from internet'https://www.developpez.net/forums/d1872997/logiciels/microsoft-office/excel/macros-vba-excel/macro-creation-ecriture-fichier-txt/#post10357479Dim WSSource As Worksheet, WSDest As Worksheet
Dim WBSource As Workbook, WBDest As Workbook
Dim Col AsLongSet WSSource = ActiveSheet
Set WBSource = ActiveWorkbook
Set WBDest = Workbooks.Add
Set WSDest = ActiveSheet
For Col = 1To WSSource.Cells(1, Columns.Count).End(xlToLeft).Column Step2
WSSource.Cells(2, Col).Resize(721, 2).Copy WSDest.Range("A1")
WBDest.SaveAs Filename:=WBSource.Path & "\" & WSSource.Cells(1, Col + 1).Value
WSDest.Columns("A:B").ClearContents
Next Col
WBDest.Clos
EndSub
Maintenant je cherche pour le mettre en format txt au lieu de xlsx, mon solveur n'arrivant pas à lire le xlsx ^^
Sub Modifiee2()'from internet : Menhir'https://www.developpez.net/forums/d1872997/logiciels/microsoft-office/excel/macros-vba-excel/macro-creation-ecriture-fichier-txt/#post10357479Dim WSSource As Worksheet, WSDest As Worksheet
Dim WBSource As Workbook, WBDest As Workbook
Dim Col AsLongSet WSSource = ActiveSheet
Set WBSource = ActiveWorkbook
Set WBDest = Workbooks.Add
Set WSDest = ActiveSheet
For Col = 1To WSSource.Cells(1, Columns.Count).End(xlToLeft).Column Step2
WSSource.Cells(2, Col).Resize(721, 2).Copy WSDest.Range("A1")'WBDest.SaveAs Filename:=WBSource.Path & "\" & WSSource.Cells(1, Col + 1).Value
WBDest.SaveAs Filename:=WBSource.Path & "\" & WSSource.Cells(1, Col + 1).Value & ".txt", FileFormat:= _
xlText, CreateBackup:=False
WSDest.Columns("A:B").ClearContents
Next Col
WBDest.Clos
EndSub
Merci énormément.
11/07/2018, 14h00
Menhir
Citation:
Envoyé par MatthieuB_
Maintenant je cherche pour le mettre en format txt au lieu de xlsx, mon solveur n'arrivant pas à lire le xlsx ^^
Dans ce cas, il serait bien plus simple de créer un nouvel onglet plutôt qu'un nouveau classeur puisqu'on peut appliquer SaveAs aussi à Worksheet.
Le CreateBackup est inutile (il est à False par défaut de toute façon) et je ne vois pas non plus l'intérêt du Activate qui suit (à part ralentir l'exécution).
11/07/2018, 14h12
Menhir
Citation:
Envoyé par MatthieuB_
Ça marche, tout en .txt et sans la première ligne.
Il aurait été plus propre, plus sûr et plus souple d'écrire :
Code:
1 2 3 4 5 6
For Col = 1To WSSource.Cells(1, Columns.Count).End(xlToLeft).Column Step2
WSSource.Cells(1, Col).Resize(1, 2).EntireColumn.Copy WSDest.Range("A1")
WSDest.Rows(1).Delete
WBDest.SaveAs Filename:=WBSource.Path & "\" & WSSource.Cells(1, Col + 1).Value & ".txt", FileFormat:= xlText
WSDest.Columns("A:B").ClearContents
Next Col
L'avantage de ce code, c'est qu'il s'adapte au changement du nombre de lignes.