XL pour MAC La méthode "_default" de l'objet "Range" a échoué

Rod59

XLDnaute Nouveau
Bonjour, je ne comprends pas pourquoi le module VBA suivant ne fonctionne pas.
Il s'agit ici de demander le nombre de lignes et de colonnes que souhaite voir l'utilisateur dans sa feuille de calcul dès l'ouverture.
La ligne qui pose problème au déboggage est la ligne : ws.Columns(x + 1 & ":" & totalColonnes).Hidden = True

Merci d'avance
Rod


Sub AjusterFeuille()
Dim x As Integer
Dim y As Integer
Dim ws As Worksheet
Dim totalColonnes As Integer
Dim totalLignes As Long

' Création d'une nouvelle feuille de calcul
Set ws = ThisWorkbook.Sheets.Add

' Demander le nombre de colonnes
On Error Resume Next
x = Application.InputBox("Entrez le nombre de colonnes (entre 1 et 16384) :", Type:=1)
If Err.Number <> 0 Or x < 1 Or x > 16384 Then
MsgBox "Valeur invalide pour les colonnes.", vbCritical
Exit Sub
End If
On Error GoTo 0

' Demander le nombre de lignes
On Error Resume Next
y = Application.InputBox("Entrez le nombre de lignes (entre 1 et 1048576) :", Type:=1)
If Err.Number <> 0 Or y < 1 Or y > 1048576 Then
MsgBox "Valeur invalide pour les lignes.", vbCritical
Exit Sub
End If
On Error GoTo 0

' Obtenir les dimensions totales de la feuille
totalColonnes = ws.Columns.Count
totalLignes = ws.Rows.Count

' Masquer les colonnes excédentaires
If x < totalColonnes Then
ws.Columns(x + 1 & ":" & totalColonnes).Hidden = True
End If

' Masquer les lignes excédentaires
If y < totalLignes Then
ws.Rows(y + 1 & ":" & totalLignes).Hidden = True
End If

' Message de confirmation
MsgBox "La feuille a été ajustée à " & x & " colonnes et " & y & " lignes.", vbInformation
End Sub
 
Solution
Bonjour à tous,

Columns(...) n'accepte que des lettres pour désigner les colonnes à une exception près :
  • Columns("a").Select OK
  • Columns("a:a").Select OK
  • Columns("a:b").Select OK
  • Columns(2).Select OK (exception - quand une seule colonne). Ici colonne 2 soit colonne B
  • -------------------------------------------------------------------------------
  • Columns("1:1").Select NON
  • Columns("1:2").Select NON
  • Columns(1:1).select NON
Donc votre range : ws.Columns(x + 1 & ":" & totalColonnes) provoquera une erreur.
J'écrirai plutôt (voir code ci-dessous) ...

patricktoulon

XLDnaute Barbatruc
bonjour
en fait ce message pourrait être difficile quand on comprend pas le contexte
et @TooFatBoy semble faire le même erreur
j'explique
ws ----->c'est la feuille
.Range( -->enoncé d'un range appartenant a ws
Cells(1, x + 1),'c'est ici le problème que de temps en temps on a le message l'object range a échoué(même si de temps en temps sur la feuille active ça passe )
Cells(1, totalColonnes)).' ici aussi
EntireColumn.Hidden = True
pourquoi et bien par ce que l'on essaie de faire un range du ws avec une cell1 sans parent de même que la cells2
l'écrire comme ça
VB:
ws.Range(ws.Cells(1, x + 1), ws.Cells(1, totalColonnes)).EntireColumn.Hidden = True
'ou
with ws
.Range(.Cells(1, x + 1), .Cells(1, totalColonnes)).EntireColumn.Hidden = True
end with

quand on crée un range avec 2 object cells les cells doivent avoir le même parent que le range
Code:
set rng=parent.range(mêmeparent.cells(a,b),mêmeparent.cells(x,y))

Patrick
Meilleurs veux
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Columns(...) n'accepte que des lettres pour désigner les colonnes à une exception près :
  • Columns("a").Select OK
  • Columns("a:a").Select OK
  • Columns("a:b").Select OK
  • Columns(2).Select OK (exception - quand une seule colonne). Ici colonne 2 soit colonne B
  • -------------------------------------------------------------------------------
  • Columns("1:1").Select NON
  • Columns("1:2").Select NON
  • Columns(1:1).select NON
Donc votre range : ws.Columns(x + 1 & ":" & totalColonnes) provoquera une erreur.
J'écrirai plutôt (voir code ci-dessous) : Columns(x + 1).Resize(, .Columns.Count - x).Hidden = True


Pour votre code, j'écrirai comme cela :
VB:
Sub AjusterFeuille()
Dim x As Long, y As Long
   ' Création d'une nouvelle feuille de calcul
   With ThisWorkbook.Sheets.Add
      ' Demander le nombre de colonnes
      On Error Resume Next
      x = Application.InputBox("Entrez le nombre de colonnes (entre 1 et " & .Columns.Count & ") :", Type:=1)
      If x < 1 Or x > .Columns.Count Then MsgBox "Valeur incorrecte pour les colonnes.", vbCritical: Exit Sub
 
      ' Demander le nombre de lignes
      y = Application.InputBox("Entrez le nombre de lignes (entre 1 et " & .Rows.Count & ") :", Type:=1)
      If y < 1 Or y > .Rows.Count Then: MsgBox "Valeur incorrecte pour les lignes.", vbCritical: Exit Sub
 
      ' Masquer les colonnes et lignes excédentaires
      .Columns(x + 1).Resize(, .Columns.Count - x).Hidden = True
      .Rows(y + 1).Resize(.Rows.Count - y).Hidden = True
      MsgBox "La feuille a été ajustée à " & x & " colonnes et " & y & " lignes.", vbInformation
      On Error GoTo 0
   End With
End Sub

nota : la remarque de @patricktoulon ;) reste judicieuse et elle est aussi à prendre en compte.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @patricktoulon :),

Surtout pour te souhaiter une très belle année 2025 🤩.

quand on crée un range avec 2 object cells les cells doivent avoir le même parent que le range
Code:
set rng=parent.range(mêmeparent.cells(a,b),mêmeparent.cells(x,y))

Cette affirmation est sans doute un peu trop restrictive, non ?

Le code suivant crée bien un range au sein de la feuille Feuil2 alors que range n'est pas préfixé et que la feuille active est la feuille Feuil1
VB:
Sub test()
Dim Xrg As Range
   Feuil1.Select  'selection Feuil1
   Set Xrg = Range(Feuil2.Range("a1"), Feuil2.Cells(5, "c"))   ' Range non indexé
   MsgBox "Nom de la feuille active = " & ActiveSheet.Name & vbLf & vbLf & _
      "Nom du parent de Xrg =" & Xrg.Parent.Name
   Application.Goto Xrg
End Sub

nota : je considère cependant que ta façon de faire est la plus prudente et c'est aussi la mienne. Donc ta formulation est pour moi plus que légitime et à respecter 😜.
 
Dernière édition:

Rod59

XLDnaute Nouveau
Bonjour et un grand merci, vous avez répondu à ma demande ! C'est exactement ce que je voulais 👏.
Oserais-je vous demander s'il est possible que cette macro soit utilisable avec tous les classeurs ? En d'autres termes où faut-il que je la range pour qu'elle soit toujours disponible ?

J'imagine qu'il faudra que j'ajoute dans mes déclarations :

Dim nouveauClasseur As Workbook
Set nouveauClasseur = Workbooks.Add

Le problème c'est que ceci va bien me créer une nouvelle feuille mais le script s'exécutera toujours dans la feuille où se trouve la macro, ce qui est normal. J'aimerais donc que le module se range dans un dossier de modules "global" et pas dans un classeur en particulier.

Vous aurez bien compris que je n'ai pas votre maîtrise du VBA, en tout cas tout cela est très intéressant !

Très belle année à vous 🎄
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
489

Membres actuellement en ligne

Statistiques des forums

Discussions
315 236
Messages
2 117 645
Membres
113 217
dernier inscrit
noa_2213