2017-07-26 3 views
-1

premier message ici désolé si le formatage est vraiment mauvais. Besoin d'aide avec un fichier Excel VBA sur lequel je travaille. Le code est ci-dessous et une description ci-dessous. Toute aide serait appréciéeVBA Excel .Range syntaxe et comparateurs

Sub Main() 

' Declare all variables  
Dim LastRow As Long 
Dim x As Long 
Dim y As Long 
Dim Date1 As Date 
Dim Date2 As Date 
Dim prod As String 
Dim Add As Integer 
Dim var1 As Integer 
Dim var2 As Integer 
Dim ProdString As String 

'Calculate the number of rows in the sheet, then run a for loop for every row. 
LastRow = Cells(Rows.Count, 1).End(xlUp).Row 
For x = 2 To LastRow 
y = x 

'concatenate the current row number (x) and third column to a string (prod string), then check to see what letter is in that cell. 
'Assign a letter to concatenate with variable 'x' to String Prod for the .Range Function 

ProdString = x & 3 
**If Range(ProdString).Value = "I" Then** 
    prod = "K" 
ElseIf Application.ActiveSheet.Range(ProdString).Value = "E" Then 
    prod = "L" 
ElseIf Application.ActiveSheet.Range(ProdString).Value = "O" Then 
    prod = "M" 
ElseIf Application.ActiveSheet.Range(ProdString).Value = "Q" Then 
    prod = "N" 
Else: prod = "O" 
End If 

' Add two numbers together in two different cells and assign to the second cell 
var1 = Application.ActiveSheet.Range("D" & x).Value 
var2 = Application.ActiveSheet.Range("prod" & x).Value 
Add = var1 + var2 
Application.ActiveSheet.Range("prod" & x).Value = Add 


'While Loop to go through applicable date range from starting date to end date and add to those columns 
Do While True 

Date1 = Application.ActiveSheet.Range(y, 6).Value 
Date2 = Application.ActiveSheet.Range(y + 1, 6).Value 
If Application.ActiveSheet.Range(y, 7).Value <> Application.ActiveSheet.Range(y + 1, 7) Then Exit Do 
If Date1 < Date2 Then Exit Do 

var1 = Range("D" & x).Value 
var2 = Range("prod" & y).Value 
Add = var1 + var2 
Range("prod" & y).Value = Add 
y = y + 1 

Loop 

Next x 
End Sub 

Le fichier Excel Je travaille avec un classeur, sur une feuille avec 10k lignes et 15 colonnes. J'essaye d'ajouter un nombre dans une colonne à l'autre basé sur des dates. Mais le problème actuel que je suis essaie juste de comprendre la fonction .Range Bolded et pourquoi cela ne fonctionnera pas. J'ai essayé de le précéder avec le classeur et le nom de page spécifiques mais j'ai des erreurs de portée globale quand je le fais. Je veux juste comparer ce qui est à l'intérieur de la cellule à la plage spécifiée, et s'il s'agit d'une certaine chaîne, attribuez une valeur à une valeur de chaîne différente. Merci.

+1

Vous regardez PodString, qui est une chaîne, tout en essayant d'utiliser cela comme une plage. Vous aurez besoin de définir la plage dans laquelle vous voulez travailler. Exemple, si PodString = fdsa, alors Range ("fdsa") ferait une erreur; si PodString était une plage et = Range ("A2: B2"), alors Range (PodString) = Range ("A2: B2"). – Cyril

+1

Aussi, lorsque vous démarrez votre sous-marin, vous avez déclaré 'X' mais vous ne lui avez jamais donné de valeur. Pourquoi même utiliser 'x'? Que voulez-vous dire par 'Range (podString)'? Ça va être un nombre unique, non? Comme 'Range (3)'? – BruceWayne

+1

@BruceWayne J'ai une réponse avec une liste de questions plus importante ... dans l'espoir d'obtenir du code après que l'intention soit devenue plus claire. C'est ... assez approximatif pour extrapoler l'intention des variables. – Cyril

Répondre

0

Planification mise à jour avec le code, une fois que je peux comprendre ce qui se passe ...


Essayer de construire sur mon commentaire pour vous, en utilisant ce que je sens que je peux interpréter à partir de votre code.

Je crois que vous essayez de parcourir une plage, bien que j'éprouve des difficultés à placer vos variables x et y en fonction de l'endroit où elles sont utilisées. Je vais essayer de déduire ... en supposant que vous vérifiez par ProdString = x & 3 pour signifier la troisième ligne, x est votre colonne. Je vois des comparaisons pour la chaîne spécifique dans I3 (cellules (3,9)), E3 (cellules (3,5)), O3 (cellules (3,15)), et Q3 (cellules (3,17)).

Je ne vois pas ce que ProdString est censé être ... que comparez-vous?

Je suppose que vous voulez quelque chose comme (ce n'est pas suffisant le code atm):

Dim ProdString as String, prod as String, x as Integer 

ProdString = Cells(3,prod).Value 

If Cells(3,9).Value=ProdString Then 
    prod = Cells(3,11).Value 'Getting lost at why prod us being used as such 
    Else 
    End If 

Je ne peux pas comprendre ce que vous essayez d'ajouter, puisque la colonne = x, mais vous êtes en utilisant des plages plus tard, telles que Range ("D" & x).


Edit:

Après avoir obtenu des éclaircissements à mes questions, j'aurais les modifications suivantes à votre code (seulement apportant les éléments que je dois corriger l'erreur Range:

Dim prod as String, x as Integer 

For x = 2 to LastRow 

    If Cells(x,3).Value = "I" Then 
     prod = "K" 
     Else 'Only showing the one option to shorten my response 
     End If 

Next x 

Notez que ProdString est supprimé.Comme écrit, il n'a aucune valeur.La chaîne de x & 3 est pas une plage, et ne peut pas être utilisé comme une plage, par exemple, Range (ProdString). rangées d'une colonne, vous pouvez ignorer en utilisant Range() et aller via Cells() pour faire une approche simple.

Spécifique à ce qui est dans ce code, vous dites que la valeur contenue dans la cellule bouclée a la valeur "I". Sans voir les données, je peux seulement supposer que vous êtes en fait seulement à la recherche de la valeur "I", bien que l'utilisation de prod me fasse penser que c'est faux. Je suppose que vous essayez de capturer le nom/numéro de la colonne, donc vous aurez besoin de regarder cela parce que si vous êtes verrouillé à la colonne 3 et en boucle à travers les lignes, vous ne verrez jamais la colonne "I".Je recommande la modification suivante pour remplacer prod:

Dim x as Integer, prod as Integer 

For x = 2 to LastRow 

    If Cells(x,3).Value = "I" Then 'Ensure that this is truly supposed to be a value of I in the cell 
     prod=Cells(x,11).Value 
     Cells(x,11).Formula=Cells(x,4).Value+prod 'It looks like you're overwriting the cell in row x, column 11 
     Else 
     End If 

Next x 

Laissez-moi savoir si cela efface tout vers le haut.

+0

Merci d'avoir pris le temps de regarder mon code. Je me suis précipité pour le mettre en place et j'ai réalisé que j'avais enlevé des parties qui étaient importantes. le point du code est de faire une boucle for pour chaque ligne, ajouter une valeur dans une ligne à une autre colonne de la même ligne en fonction d'une autre valeur. Ensuite, faites une boucle while et continuez d'ajouter ce nombre dans la rangée x aux y rangées suivantes. Si les comptes ne correspondent pas ou que les dates ne sont pas synchronisées, quittez la boucle while et continuez avec la boucle x for. J'espère que cela clarifie une certaine confusion. Ma principale préoccupation consiste simplement à faire fonctionner la fonction .Range. – JGenchi

+0

@JGenchi Ensuite, le commentaire initial serait (à votre poste). Vous n'avez pas QualString qualifié de plage et ce n'est pas une plage que vous utilisez. Je mettrai à jour ma réponse pour montrer ce que je veux dire. – Cyril

+0

@JGenchi S'il vous plaît voir ce que j'ai ci-dessous le Modifier ... J'ai corrigé pour votre problème de gamme, mais comme mentionné, vous pourriez rencontrer plus de problèmes avec l'approche choisie. – Cyril