2009-07-15 4 views
0

Ich habe fast meinen Code funktioniert, aber es gibt immer noch zwei Dinge falsch (zwei wichtige Dinge sowieso).Wie mache ich absolute Zellenreferenzen in Schleifen und überspringe eine Spalte in einer Schleife?

1) Die absolute Zelle ref. funktioniert nicht wie es in Excel funktioniert. Ich möchte zum Beispiel $ A5, aber anstatt auf A6 A7 etc. zu wechseln, bleibt es während der gesamten Schleife A5.

2) Es gibt eine dritte Spalte, die ich überspringen muss. Ich brauche nur meine Schleife, um in Spalten unter VOL und CAP, nicht% UTIL zu schreiben. Wie kann ich meiner Schleife mitteilen, dass sie $ UTIL überspringen soll?

alt text http://i27.tinypic.com/2dig8hu.jpg

Option Explicit 
Dim myRange As Range 

Function numberOfRows() As Integer 
    Debug.Print ("Start test") 

    ThisWorkbook.Worksheets("LCI").Range("A9").Select 

    Set myRange = Range(Selection, Selection.End(xlDown)) 

    Debug.Print ("Rows: " & myRange.Rows.Count) 

    numberOfRows = (myRange.Rows.Count) 
End Function 

Function numberOfColumns() As Integer 
    Debug.Print ("Start test") 

    ThisWorkbook.Worksheets("LCI").Range("B8").Select 

    Set myRange = Range(Selection, Selection.End(xlToRight)) 

    Debug.Print ("Columns: " & myRange.Columns.Count) 

    numberOfColumns = (myRange.Columns.Count) 
End Function 

Sub TieOut(ByVal numberOfRows As Integer, ByVal numberOfColumns As Integer) 
    Dim i As Integer 'i is row 
    Dim j As Integer 'j is column 

    For i = 1 To numberOfRows 'Loop over rows 
     For j = 1 + 2 To numberOfColumns 'Loop over columns 
     ThisWorkbook.Worksheets("Loop").Select 
      With ThisWorkbook.Worksheets("Loop") 
       **.Cells(i + 3, j + 1).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),4)" 
       .Cells(i + 3, j + 2).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),5)"** 
      End With 
     Next j 
    Next i 
End Sub 

Sub Test() 
    Dim x As Integer 
    Dim y As Integer 
    x = numberOfRows() 
    y = numberOfColumns() 

    Call TieOut(x, y) 
End Sub 

Antwort

0

Wo Sie es definiert haben? Ist es Teil eines BAS-Moduls?

EDIT: Put Option Explicit als die erste Zeile des BAS-Moduls & kompilieren (Debug-Menü -> Kompilieren).
Sie werden feststellen, dass Kompilierungsfehler vorliegen.

Entfernen Sie Dim myRange As Range von Macro1 & Macro2.
Setzen Sie es an der Spitze des BAS-Moduls (nach Option explizit)

Hinweis: Wenn Sie eine Variable als Teil eines SUB definiert haben, können andere SUB/Funktionen nicht verwenden. Damit TieOut myRange verwendet, muss es in einem Bereich definiert werden, in dem es von allen SUBs verwendet werden kann.

Auch sollte Makro1 laufen zuerst - die den Wert zuweist (dh Set MyRange = .....) myRange
Wenn Makro1 wird nicht ausgeführt, wird MyRange & keinen Wert halten daher wird es Laufzeitfehler, wenn Ihr Code versucht, die Eigenschaft (MyRange.Rows.Count) zu lesen.

Bitte nehmen Sie sich etwas Zeit, um etwas über das Scoping von Variablen zu lesen.
Eine Variable muss einen Wert enthalten, bevor Sie versuchen, daraus zu lesen.

+0

Meine NummerOfRows = die von Macro1 zurückgegebene Zahl numberOfColumns = die von Macro2 zurückgegebene Zahl – Techgirl09

+0

Was meinen Sie mit Define? – Techgirl09

+0

Was meinst du mit nicht zurück? – shahkalpesh

0

Dies ist ein großartiges Beispiel, um zu lernen, was "Scope" ist. Sie deklarieren (oder erzeugen) eine Variable wie den Bereich, den Sie versuchen zu machen. Es lebt innerhalb des von Ihnen erstellten Makros (oder Unterverfahrens). Wenn die Unterprozedur jedoch abgeschlossen ist, hat Ihre Variable keinen Platz mehr zum Leben und wird entfernt (wird aus dem Speicher Ihres Computers gelöscht).

Leider funktioniert die Art, wie Sie Ihre Makros codiert haben, nicht so, wie Sie hoffen, dass sie funktionieren. Deine myRanges werden jedes Mal sterben, wenn sie ein End-Sub erreichen.

Auch wenn Sie Argumente (Ihre Bytes) an eine andere Unterprozedur übergeben (in diesem Fall Ihre TieOut), müssen Sie die richtige Anzahl an Argumenten angeben. Ihr TieOut-Verfahren erfordert derzeit zwei. Du kannst nicht eins und dann das andere passieren. Der richtige Weg würde in etwa so aussehen:

Call TieOut(myRange.Rows.Count, myRange.Columns.Count) 

Auch Sie versuchen, eine Prozedur namens TieOut2 aufzurufen. Ich bin mir nicht sicher, ob das ein Tippfehler ist, aber es ist wichtig, die Verfahrensnamen richtig zu machen.

VBA ist sehr mächtig und meiner Meinung nach lernenswert. Du siehst aus, als ob du an der Oberfläche kratzt. Ich würde definitiv nach einigen VBA Tutorials online suchen.Konzentrieren Sie sich auf das Aufrufen von Prozeduren, Variablendeklarationen und Gültigkeitsbereichen und ich garantiere Ihnen, dass Sie Ihr Problem lösen können: D

+0

Danke, werde def. Überprüfe alles, was du notiert hast. – Techgirl09

Verwandte Themen