Error dans le code
Bonjour,
Quelqu'un aura une idée pourquoi cette boucle ne marche pas ?
Merci
Sub test1()
Dim NombreLigne As Integer
Sheets("Composite").Select
NombreLigne = 602
a = 2
c = 1
For i = 2 To NombreLigne
For b = 3 To 176
If Cells(i, b) = "XX" Then
Sheets("XX").Cells(a, c).Value = Sheets("Composite").Cells(i, b).Value
End If
Next
b = b + 4
c = c + 3
Next
End Sub
Bonsoir,
à voir le code on comprend qu'il ne peut pas fonctionner, par contre impossible de déterminer ce que tu cherches à faire. Mets-nous un fichier exemple de ce que tu as, de ce que tu veux et les règles à respecter pour passer de l'un à l'autre.
Bonsoir,
à voir le code on comprend qu'il ne peut pas fonctionner, par contre impossible de déterminer ce que tu cherches à faire. Mets-nous un fichier exemple de ce que tu as, de ce que tu veux et les règles à respecter pour passer de l'un à l'autre.
Bonsoir,
Voici un exemple le but c'est de copier/coller avec conditions pour chaque table Pour A et la valeur en face dans la feuille nommé A et B et la valeur en face dans la feuille nommé B et C et la valeur en face dans la feuille nommé C et W et la valeur en face dans la feuille nommé W.sachant que la vrai table de donnee est 200 plus grande donc 200 periode.
j'ai essaye une boucle mais ca ne marche pas.
Merci
Bonjour,
Quelqu'un aura une idée pourquoi cette boucle ne marche pas ?
Désolé, mais cette boucle fonctionne.
Celle du fichier, c'est autre chose.
ric
Bonjour,
Quelqu'un aura une idée pourquoi cette boucle ne marche pas ?
Désolé, mais cette boucle fonctionne.
Celle du fichier, c'est autre chose.
ric
Le resultat que j'obtient ne corresponds pas a ce que je cherche vous avez essaye de votre cote ?
Bonjour themindhaze, le forum,
la sub de ton énoncé peut se réduire à ceci :
Option Explicit
Sub test1()
Dim c%, i%, b As Byte: c = 1: Worksheets("Composite").Select
For i = 2 To 602
For b = 3 To 176
If Cells(i, b) = "XX" Then Worksheets("XX").Cells(2, c) = "XX"
Next b
c = c + 3
Next i
End Sub
remarques :
1) j'ai enlevé la variable NombreLigne et mis le nombre 602 directement dans l'instruction For b = 3 To 176
2) la variable a est utilisée seulement pour Sheets("XX").Cells(a, c).Value
; j'ai simplifié ainsi :
Worksheets("XX").Cells(2, c)
3) j'ai déclaré ces 3 variables : c ; i ; b (en mettant le type adéquat) ; Dim i%
est la même chose que Dim i As Integer
4) le 1er Next est en fait Next b
; le 2ème Next est en fait Next i
(ça accélère le code d'indiquer explicitement la variable du For)
5) comme il y a Sheets("Composite").Select
: la feuille active est bien "Composite", n'est-ce pas ? donc pour le test If
ça signifie que Cells(i, b)
(sans référence de feuille explicite) est une cellule de la feuille active, donc de la feuille "Composite" ; exact ? alors de la même façon, Sheets("Composite").Cells(i, b).Value
peut devenir simplement : Cells(i, b)
; de plus, suite au test réussi sur "XX", c'est donc forcément "XX" ; d'où ceci : Then Worksheets("XX").Cells(2, c) = "XX"
6) oh ! mais il manque b = b + 4
!
* dans le code initial, b est incrémenté de 4 ; ok, et ensuite ?
* c est incrémenté de 3 ; et note bien que b n'est pas utilisé
* on tombe sur le 2ème Next
(celui du i) ; donc i est incrémenté et ça remonte à la ligne d'instruction qui suit le For i
* et là qu'est-ce qu'on trouve ? For b = 3 To 176
➯ b est initialisé à 3 ➯ l'incrémentation de b de 4 a servi à rien !
dhany
Salut Themindhaze,
salut l'équipe,
quelque chose comme ça?
Un double-clic en 'Fort' démarre la macro...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Cancel = True
Application.ScreenUpdating = False
'
For x = 1 To Sheets.Count
If Sheets(x).Name <> "Fort" Then Sheets(x).Cells.ClearContents
Sheets(x).Cells.Borders.LineStyle = xlLineStyleNone
Sheets(x).Cells.Interior.Color = xlNone
Next
Exit Sub
'
iCol = Cells(2, Columns.Count).End(xlToLeft).Column
For x = 1 To iCol Step 2
sCol = Split(Columns(x).Address(ColumnAbsolute:=False), ":")(1)
If Range(sCol & Rows.Count).End(xlUp).Row > 2 Then
For y = 3 To Range(sCol & Rows.Count).End(xlUp).Row
iOK = 0
For Z = 1 To Sheets.Count
If Sheets(Z).Name = CStr(Cells(y, x)) Then iOK = 1: Exit For
Next
If iOK = 0 Then Worksheets.Add(after:=Sheets(Sheets.Count)).Name = CStr(Cells(y, x))
With Worksheets(CStr(Cells(y, x)))
For k = 1 To iCol Step 2
sCol1 = Split(Columns(k).Address(ColumnAbsolute:=False), ":")(1)
If .Range(sCol1 & Rows.Count).End(xlUp).Row = 1 Then
.Range(sCol1 & 1).Value = "Période " & (k + 1) / 2
.Range(sCol1 & 1).Resize(1, 2).MergeCells = True
.Range(sCol1 & 2).Value = "Nom"
.Range(sCol1 & 2).Offset(0, 1).Value = "donne"
End If
Next
.Range(sCol & .Range(sCol & Rows.Count).End(xlUp).Row + 1).Resize(1, 2).Value = Range(sCol & y).Resize(1, 2).Value
End With
Next
End If
Next
'
For x = 1 To Sheets.Count
With Sheets(x)
iRow = .UsedRange.Rows.Count
iCol = .UsedRange.Columns.Count
.Cells.HorizontalAlignment = xlCenter
.UsedRange.Borders.LineStyle = xlContinuous
.UsedRange.BorderAround Weight:=xlMedium
.Range("A1").Resize(1, iCol).Interior.Color = RGB(195, 195, 195)
.Range("A2").Resize(1, iCol).Interior.Color = RGB(215, 215, 215)
End With
Next
If Sheets.Count > 2 Then
For x = 2 To Sheets.Count
For y = 3 To Sheets.Count
If Sheets(y).Name < Sheets(y - 1).Name Then Sheets(y).Move before:=Sheets(y - 1)
Next
Next
End If
'
Application.ScreenUpdating = True
'
End Sub
A+
Salut Themindhaze,
salut l'équipe,
quelque chose comme ça?
Un double-clic en 'Fort' démarre la macro...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' Cancel = True Application.ScreenUpdating = False ' For x = 1 To Sheets.Count If Sheets(x).Name <> "Fort" Then Sheets(x).Cells.ClearContents Sheets(x).Cells.Borders.LineStyle = xlLineStyleNone Sheets(x).Cells.Interior.Color = xlNone Next Exit Sub ' iCol = Cells(2, Columns.Count).End(xlToLeft).Column For x = 1 To iCol Step 2 sCol = Split(Columns(x).Address(ColumnAbsolute:=False), ":")(1) If Range(sCol & Rows.Count).End(xlUp).Row > 2 Then For y = 3 To Range(sCol & Rows.Count).End(xlUp).Row iOK = 0 For Z = 1 To Sheets.Count If Sheets(Z).Name = CStr(Cells(y, x)) Then iOK = 1: Exit For Next If iOK = 0 Then Worksheets.Add(after:=Sheets(Sheets.Count)).Name = CStr(Cells(y, x)) With Worksheets(CStr(Cells(y, x))) For k = 1 To iCol Step 2 sCol1 = Split(Columns(k).Address(ColumnAbsolute:=False), ":")(1) If .Range(sCol1 & Rows.Count).End(xlUp).Row = 1 Then .Range(sCol1 & 1).Value = "Période " & (k + 1) / 2 .Range(sCol1 & 1).Resize(1, 2).MergeCells = True .Range(sCol1 & 2).Value = "Nom" .Range(sCol1 & 2).Offset(0, 1).Value = "donne" End If Next .Range(sCol & .Range(sCol & Rows.Count).End(xlUp).Row + 1).Resize(1, 2).Value = Range(sCol & y).Resize(1, 2).Value End With Next End If Next ' For x = 1 To Sheets.Count With Sheets(x) iRow = .UsedRange.Rows.Count iCol = .UsedRange.Columns.Count .Cells.HorizontalAlignment = xlCenter .UsedRange.Borders.LineStyle = xlContinuous .UsedRange.BorderAround Weight:=xlMedium .Range("A1").Resize(1, iCol).Interior.Color = RGB(195, 195, 195) .Range("A2").Resize(1, iCol).Interior.Color = RGB(215, 215, 215) End With Next If Sheets.Count > 2 Then For x = 2 To Sheets.Count For y = 3 To Sheets.Count If Sheets(y).Name < Sheets(y - 1).Name Then Sheets(y).Move before:=Sheets(y - 1) Next Next End If ' Application.ScreenUpdating = True ' End Sub
A+
Merci beaucoup cela marche mais je vous envoie une version qui corresponds a mon fichier le but c'est de copier/coller par sector pareil dans le fichier avant sauf que cette fois il faut pas du tous prendre le secteur que les colomuns avec Date, Nom et Pays ?
Vous auriez une idée ? Merci