1
votes

Existe-t-il un moyen d'exprimer des variables avec une plage de nombres pour répondre à une condition de boucle dans vba

Existe-t-il un moyen d'exprimer la variable f comme une plage de nombres comme par exemple, f = 4 à 9 dans Excel vba? Parce que mon intention ici est de créer une condition telle que pour i = 1 à lastColumn, si i tombe dans la plage 4 à 9, en tant que tel, il parcourra les valeurs de i à la dernière colonne et acceptera les en-têtes (tension, puissance et temps) qui se trouve à l'intérieur des cellules (1,4) aux cellules (1,9) et après cela, le temps de sous-tension privé sera appelé là où il crée plusieurs pivottables en utilisant les colonnes de tension, de puissance et de temps lorsque leurs en-têtes sont détectés au premier rangée. Je serai également reconnaissant s'il existe d'autres moyens d'exprimer mon intention ici.

entrez la description de l'image ici

 Dim sh as Worksheet

Dim LastColumn as integer

Dim f as integer

f=4 to 9 '------>How to express f as a range of number?

For i = 1 to LastColumn

if i = f Then

if sht.Cells(1,f).Value = "Voltage" And sht.Cells(1,f).Value= "Power" and sht.Cells(1,f).Value= "Time" Then

Call voltagepowertime


24 commentaires

Créez un IF à l'intérieur de la boucle, IF i> = 4 et I = <9 Then etc. etc.


Je ne suis pas sûr de comprendre votre «intention» ... Pouvez-vous mieux clarifier ce que 4 à 9 veut dire? Voulez-vous dire un tableau de 4 à 9? Voulez-vous dire quelque chose de moins de 4 et plus de 9? Et comment utiliser une variable de type aussi étrange dans Cells (1, f) ? Pouvez-vous mieux expliquer (en mots) quel est votre besoin?


@FaneDuru désolé si cela semble vague pour mon message. Ce que je veux dire, c'est que f est un entier qui peut aller de 4 à 9 comme f peut être supérieur à 4 mais inférieur à la valeur 9.


Quelles colonnes de la plage souhaitez-vous conditionner de cette manière? "de i à la dernière colonne", ou à la dernière ligne?


donc mon besoin est ici que je boucle de 1 à la dernière colonne, si i = f où i = 4,5,6,7,8,9, la colonne de valeurs entière est extraite


@FaneDuru de i à lastcolumn dans ce cas ...


i peut-il être 4,3? Et si vous montez à la dernière colonne, dans quelle ligne voudrez-vous faire ces vérifications?


oh ouais je suis un entier ici donc ça ne peut pas être 4,3


Voulez-vous vérifier dans les colonnes 4,5,6,7,8,9?


@FaneDuru dans ce sens oui


Maintenant, j'ai compris où chercher, mais que vérifier dans ces colonnes?


@FaneDuru si ces colonnes ont une tension ou une heure comme en-tête de la 1ère ligne, la colonne entière de ces en-têtes sera extraite


@FaneDuru extrait dans le sens où il utilisera ces valeurs dans mon sous-tension privé pour créer plusieurs tableaux croisés dynamiques


@cena: Regardez ma réponse, s'il vous plaît! Maintenant, il sélectionne les colonnes ayant l'en-tête que vous souhaitez. Souhaitez-vous les sélectionner tous à la fois (et vous ferez quelque chose avec eux de cette manière combinée)? Pourquoi avez-vous besoin d'itérer entre toutes les colonnes existantes si vous n'avez besoin que de cette zone? | Est-ce quelque chose que vous ne nous avez pas dit?


@FaneDuru ouais je voudrais sélectionner la colonne entière en une seule fois. Il est possible de ne pas itérer entre toutes les colonnes existantes? (Désolé, je n'ai pas remarqué que je le fais involontairement). Ma question est plus de trouver la 1ère rangée qui a la puissance ou l'heure de la tension d'en-tête. Y a-t-il encore un moyen de le faire?


@FaneDuru et si la 1ère ligne a une tension ou une heure, elle appellera un sous-appel privé voltagepowertime


@FaneDuru est-il possible d'utiliser la fonction de recherche dans ce cas?


@cena: Vous pouvez utiliser Match comme ceci: Debug.Print WorksheetFunction.Match ("Voltage", Range ("A1: I1")) . Mais ma réponse était-elle ce que vous recherchiez?


@cena: Dans le cas de la fonction Match , vous devez faire attention. S'il ne trouve pas de correspondance, il renverra une erreur. Cet aspect peut être contrôlé à l'aide d'une fonction différente ...


@FaneDuru ouais votre conseil est un peu utile car je ne devrais pas essayer d'itérer entre toutes les colonnes existantes et devrais utiliser quelque chose comme la fonction find ou match à la place, je pense?


@cena: Alors, fais-le comme tu l'aimes! Je pouvais également voir une question en double contenant le même problème ...


@cena: Je viens de publier une autre réponse répondant à la question de la nouvelle façon de poser ... Veuillez confirmer qu'elle correspond à votre besoin.


@FaneDuru Salut la réponse que vous avez donnée n'est pas le problème principal mais je devrais être blâmé pour ma mauvaise explication car il y a des termes techniques dans VBA avec lesquels je ne suis pas familier. Néanmoins, merci pour votre temps et vos efforts. J'apprécie beaucoup


Mais quelles étaient vos attentes, telles que je les comprenais, auxquelles la réponse n'a pu répondre?


4 Réponses :


0
votes

Ce n'est peut-être pas la meilleure solution s'il y avait une plus grande plage de nombres, mais vous pouvez utiliser une sélection de cas .

select case i
    case 4,5,6,7,8,9
        'do something
    case else
        'do something else
end select


1 commentaires

hé merci pour la suggestion, mais je crains que ce ne soit problématique car mon programme actuel doit exécuter un grand nombre de colonnes, donc l'utilisation de case pourrait être très fastidieuse



1
votes

Comme Daghan l'a suggéré, vous pouvez facilement obtenir ce que vous voulez avec une condition If dans votre boucle qui teste si le nombre est compris entre 4 et 9.

Votre canapé ressemblerait plus à ceci:

Dim sh as Worksheet
Dim LastColumn as integer

For i = 1 to LastColumn

  'You can easily change these numbers to fit whatever range you want
  if i >= 4 And i =< 9 Then

     if sht.Cells(1,i).Value = "Voltage" And sht.Cells(1,i).Value= "Power" and sht.Cells(1,i).Value= "Time" Then

        Call voltagepowertime

     End if

  End if
Next


2 commentaires

merci pour les réponses mais puis-je vérifier avec vous, le f dans sht.cells (1, f) .value devrait être remplacé par i dans ce cas?


C'est vrai, désolé! Puisque c'est ce que vous recherchez spécifiquement, tout ce que "i" passe le test if sera ce que vous voulez tester sur votre second if. J'ai édité la réponse pour refléter cela.



1
votes
Sub testExtraction()
   Dim sh As Worksheet, i As Long
   Set sh = ActiveSheet ' use here your sheet

   For i = 4 To 9
    If sh.Cells(1, i).Value = "Voltage" Or _
          sh.Cells(1, i).Value = "Power" Or _
          sh.Cells(1, i).Value = "Time" Then
         '"extract" your column. I did not understand what this extraction means...
         sh.Cells(1, i).EntireColumn.Select: Stop
    End If
   Next i
End Sub
I do not know what do you mean by 'extraction'. Now, the code stops after selecting of the column having the right header...

0 commentaires

1
votes

Cela devrait répondre à votre deuxième question / approche ...

Sub testMatch()
Dim sh As Worksheet, rng As Range, voltPos As Long
 Set sh = ActiveSheet ' use please your sheet here
 Set rng = sh.Range("A1:I1")
 voltPos = IsMatch(rng, "Voltage")
 If voltPos <> 0 Then
    sh.Cells(1, voltPos).EntireColumn.Select
    'Call voltagepowertime 'You must know what this sub must do...
 Else
    MsgBox "Your string could not be found in the range..."
 End If
End Sub
Private Function IsMatch(rng As Range, strS As String) As Long
    On Error Resume Next
    IsMatch = WorksheetFunction.Match(strS, rng)
    If Err.Number <> 0 Then
        Err.Clear: On Error GoTo 0
        IsMatch = 0
    End If
    On Error GoTo 0
End Function

Vous pouvez également l'utiliser pour le reste de vos chaînes ...


0 commentaires