VBA Hint Needed - Change Way An Existing Project Grabs Data
-
Easier to read:
Sub IMPORT_ALL_INFORMATION() REM Set variables Dim file_in As Long Dim strInput As Variant Dim i As Integer Dim j As Integer Dim l As Integer Dim sTmp As String Dim sJob As String Dim sSchedPath As String REM end setting variables Sheets("REPORT").Select Range("C2").Select sSchedPath = "C:\Temp" Call apiCopyFile("\servername\Applications\Schedule\schedule-s\schedule, S.xls", "C:\Temp\schedule, S.xls", 0) dteStart = Application.Sheets("Report").Range("$G$27").Value dteEnd = Application.Sheets("Report").Range("$J$27").Value REM First data row of schedule, S.xls l = 4 REM First job row of Plate & Bar Spreadsheet j = 2 Do Until CDate(GetDate(GetValue(sSchedPath, "schedule, S.xls", "LOG (2)", "N" & CStr(l)))) >= dteStart l = l + 1 REM Changed from 754 to 854...may be total jobs for year...went close to 800 jobs this year . BAW If l = 854 Then MsgBox ("Hello") End If sTmp = Trim$(GetValue(sSchedPath, "schedule, S.xls", "LOG (2)", "N" & CStr(l))) If sTmp = "0" Or Len(sTmp) = 0 Or sTmp = "HOLIDAY" Then l = l + 1 End If Loop Do sJob = ParseJob(GetValue(sSchedPath, "schedule, S.xls", "LOG (2)", "B" & CStr(l))) REM Debug.Print sJob vJobFolders = Split(FindJobDir(strpathtofile & sJob), ",") For i = 0 To UBound(vJobFolders) On Error GoTo ErrorExit Application.Sheets("report").Range("C" & CStr(j)).Value = vJobFolders(i) j = j + 1 REM file number file_in = FreeFile strFileToOpen = strpathtofile & vJobFolders(i) & strFilename If Dir(strFileToOpen) <> "" Then Open strFileToOpen For Input As #file_in Put_Data_In_Array (file_in) Organize_Array_For_Print Close #file_in REM close the file End If ErrorExit: Next i l = l + 1 sTmp = Trim$(GetValue(sSchedPath, "schedule, S.xls", "LOG (2)", "N" & CStr(l))) If sTmp = "0" Or Len(sTmp) = 0 Or sTmp = "HOLIDAY" Then l = l + 1 End If Loop Until CDate(GetDate(sTmp)) >= dteEnd Sheets("REPORT").Select End Sub Function GetValue(path, file, sheet, ref) As String REM Retrieves a value from a closed workbook Dim arg As String Dim pos As Integer REM Make sure the file exists If Right(path, 1) <> "" Then path = path & "" End If If Dir(path & file) = "" Then GetValue = "File Not Found" Exit Function End If REM Create the argument arg = "REM " & path & "[" & file & "]" & sheet & "REM !" & _ Range(ref).Range("A1").Address(, , xlR1C1) REM Execute an XLM macro GetValue = ExecuteExcel4Macro(arg) REM Strip Any time from beginning of Date string pos = InStr(GetValue, ":") If pos <> 0 Then GetValue = Mid$(GetValue, pos + 3) End Function
-
@garak0410 Just don't know how to tell it, with VBA, to take each job number in column W and do what it normally did the other way and then put a warning up if it doesn't match exactly and to STOP when it teaches a null cell.
Little helper function
Function IsNullOrEmpty(val as String) as Boolean REM Strings are always initialized as "" in VB/VBA/VBS, so checking for Null is redundant. At least In theory. If (val is Null or val = "") Then IsNullOrEmpty = True Else IsNullOrEmpty = False End If End Function
To process your values (like @dafyre suggested):
Dim myRange As Range Set myRange = Sheet1.Range("W1", "W5") For Each ritem In myRange If (IsNullOrEmpty(ritem.Value)) Then REM Empty string, processing finished Exit For Else REM Do something here with ritem.Value End If Next
The original script is a bit... ugly. Could be easier to have the XLS with test data only.
-
Maybe I am just thinking a little simplistic, but was thinking that this could be all I need, after commenting out the code that goes to the other sheet:
sJob = Report.Range("W2:W50").Select(CStr(l))
But alas, it doesn't work...
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
Maybe I am just thinking a little simplistic, but was thinking that this could be all I need, after commenting out the code that goes to the other sheet:
sJob = Report.Range("W2:W50").Select(CStr(l))
But alas, it doesn't work...
I am going to play around with variations of this but each time I change something, new errors (mostly syntax) pop up...it is maddening.
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
Maybe I am just thinking a little simplistic, but was thinking that this could be all I need, after commenting out the code that goes to the other sheet:
sJob = Report.Range("W2:W50").Select(CStr(l))
But alas, it doesn't work...
I am going to play around with variations of this but each time I change something, new errors (mostly syntax) pop up...it is maddening.
Welcome to the world of software devleopment, lol.
@thwr is right. I'd take a little while to clean up the code and make it more readable (see his code post)... and then go back to make your changes.
Are all of these jobs separated out into their own Excel files (or are they some other type of file that we don't care about?)
-
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
Maybe I am just thinking a little simplistic, but was thinking that this could be all I need, after commenting out the code that goes to the other sheet:
sJob = Report.Range("W2:W50").Select(CStr(l))
But alas, it doesn't work...
I am going to play around with variations of this but each time I change something, new errors (mostly syntax) pop up...it is maddening.
Welcome to the world of software devleopment, lol.
@thwr is right. I'd take a little while to clean up the code and make it more readable (see his code post)... and then go back to make your changes.
Are all of these jobs separated out into their own Excel files (or are they some other type of file that we don't care about?)
The "jobs" are metal building jobs that are in folders on a network share. The folders the "job numbers." When searching for these jobs, it goes out to these job folders, finds a file called o PltSum.out and then takes that data and calculates the needed materials to order for the week. That calculation isn't my focus as that should still work if I get this to work differently.
-
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
-
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
OK...I am giving this a shot...I am at the point in the old code where I see when SJOB is equal to the value of the job on the date range on the other spreadsheet. Since I am moving these jobs to manually entered job numbers in Column W, will se how this works. Curretly, SJOB is equal to: sJob = ParseJob(GetValue(sSchedPath, "Schedule S.xls", "LOG (2)", "B" & CStr(l)))
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
OK...I am giving this a shot...I am at the point in the old code where I see when SJOB is equal to the value of the job on the date range on the other spreadsheet. Since I am moving these jobs to manually entered job numbers in Column W, will se how this works. Curretly, SJOB is equal to: sJob = ParseJob(GetValue(sSchedPath, "Schedule S.xls", "LOG (2)", "B" & CStr(l)))
sJob=ParaseJob(rcell.value) ?
-
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
OK...I am giving this a shot...I am at the point in the old code where I see when SJOB is equal to the value of the job on the date range on the other spreadsheet. Since I am moving these jobs to manually entered job numbers in Column W, will se how this works. Curretly, SJOB is equal to: sJob = ParseJob(GetValue(sSchedPath, "Schedule S.xls", "LOG (2)", "B" & CStr(l)))
sJob=ParaseJob(rcell.value) ?
The more I work on this (uninterrupted from day to day issues that I am NOT getting today, wooo!), the more I think I am "getting it."...I don't think we need ParseJob because what that did before was remove spaces in the job numbers that were lisited on Schedule, S. So I just need it to be rcell.value...about to code and see what happens.
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
OK...I am giving this a shot...I am at the point in the old code where I see when SJOB is equal to the value of the job on the date range on the other spreadsheet. Since I am moving these jobs to manually entered job numbers in Column W, will se how this works. Curretly, SJOB is equal to: sJob = ParseJob(GetValue(sSchedPath, "Schedule S.xls", "LOG (2)", "B" & CStr(l)))
sJob=ParaseJob(rcell.value) ?
The more I work on this (uninterrupted from day to day issues that I am NOT getting today, wooo!), the more I think I am "getting it."...I don't think we need ParseJob because what that did before was remove spaces in the job numbers that were lisited on Schedule, S. So I just need it to be rcell.value...about to code and see what happens.
puts on hard hat...
Here... Hold my beer?
-
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
OK...I am giving this a shot...I am at the point in the old code where I see when SJOB is equal to the value of the job on the date range on the other spreadsheet. Since I am moving these jobs to manually entered job numbers in Column W, will se how this works. Curretly, SJOB is equal to: sJob = ParseJob(GetValue(sSchedPath, "Schedule S.xls", "LOG (2)", "B" & CStr(l)))
sJob=ParaseJob(rcell.value) ?
The more I work on this (uninterrupted from day to day issues that I am NOT getting today, wooo!), the more I think I am "getting it."...I don't think we need ParseJob because what that did before was remove spaces in the job numbers that were lisited on Schedule, S. So I just need it to be rcell.value...about to code and see what happens.
puts on hard hat...
Here... Hold my beer?
Funny...it is amazing what a closed door and no distractions can do to your focus and clarity...and maybe "beer."...
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
In my weeks long struggle with this, I did at least try somethiing...I commented out all of the lines that grabbed the data from the other sheet (see code in posts above) and made a varient called rcell and tried this line of code:
For Each rcell In Worksheets("Sheet1").Range("W2:W50"): Debug.Print rcell.Value: Next rcell
sJob = rcell.ValueI keep getting SUBSCRIPT OUT OF RANGE.
I guess this is a lack of my own education mixed with bad coding in the first place...
A little formatting my help you see the problem...
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: Next rcell sJob = rcell.Value
It looks like you're trying to assing sJob after you come out of the For Each loop... Try:
For Each rcell In Worksheets("Sheet1").Range("W2:W50") Debug.Print rcell.Value: sJob = rcell.Value Next rcell
OK...I am giving this a shot...I am at the point in the old code where I see when SJOB is equal to the value of the job on the date range on the other spreadsheet. Since I am moving these jobs to manually entered job numbers in Column W, will se how this works. Curretly, SJOB is equal to: sJob = ParseJob(GetValue(sSchedPath, "Schedule S.xls", "LOG (2)", "B" & CStr(l)))
sJob=ParaseJob(rcell.value) ?
The more I work on this (uninterrupted from day to day issues that I am NOT getting today, wooo!), the more I think I am "getting it."...I don't think we need ParseJob because what that did before was remove spaces in the job numbers that were lisited on Schedule, S. So I just need it to be rcell.value...about to code and see what happens.
puts on hard hat...
Here... Hold my beer?
Funny...it is amazing what a closed door and no distractions can do to your focus and clarity...and maybe "beer."...
Is debug.print rCell.value showing anything in the immediate window (CTRL G or View -> Immediate window) ?
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
I'm making progress even if still getting errors...
I did put job numbers in rows W2 and W3. SJOB is still a null value even after this:
For Each rCell In Worksheets("REPORT").Range("W2:W50")
Debug.Print rCell.Value:
sJob = rCell.Value
Next rCellAnd some how, it is still pulling data from Schedule, S and putting it in Column C...I am trying to track that down...
While debugging, it DOES pull from column W and I see SJOB being assigned a job number both by hovering over the variable and in the intermediate window. It then does the same for the next job number (only entered two for this example, cell W2 and W3. The intermediate Window does show both jobs:
But it is not holding the SJOB data as it eventually goes null...
When it gets to this part:
Function FindJobDir(ByVal strPath As String) As String
Dim sResult As StringsResult = Dir(strPath & "*", vbDirectory)
FindJobDir = UCase$(sResult)
Do While sResult <> ""
sResult = Dir
If Len(sResult) > 0 Then FindJobDir = FindJobDir & "," & UCase$(sResult)
Loop
End FunctionIt just starts grabbing all job folder information from the server location...luckily it fails when it hits a ZIP folder otherwise it would have been a data overrun...
When it is executing this line: vJobFolders = Split(FindJobDir(strpathtofile & sJob), ",")
SJOB Shows Null like this:
-
That is right. The way the code works, is it just prints the rcell.value to the screen, sets SJOB =rcell.value, and then at the Next rCell line, it goes to the next cell. It's not actually doing anything beneath that.
The trick will be to comment out the "Next rCell" line
and find out where the end of the process is, and then on the next line add next rCell and see if that works.
If this thing is actively modifying files and such, I'd hightly recommend backing everything up before running it while you are working on that part.
-
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
That is right. The way the code works, is it just prints the rcell.value to the screen, sets SJOB =rcell.value, and then at the Next rCell line, it goes to the next cell. It's not actually doing anything beneath that.
The trick will be to comment out the "Next rCell" line
and find out where the end of the process is, and then on the next line add next rCell and see if that works.
If this thing is actively modifying files and such, I'd hightly recommend backing everything up before running it while you are working on that part.
Question...if I comment out the Next rCell line to test this, then what do I do with the FOR line? It will tell me there is a FOR without a NEXT.
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
That is right. The way the code works, is it just prints the rcell.value to the screen, sets SJOB =rcell.value, and then at the Next rCell line, it goes to the next cell. It's not actually doing anything beneath that.
The trick will be to comment out the "Next rCell" line
and find out where the end of the process is, and then on the next line add next rCell and see if that works.
If this thing is actively modifying files and such, I'd hightly recommend backing everything up before running it while you are working on that part.
Question...if I comment out the Next rCell line to test this, then what do I do with the FOR line? It will tell me there is a FOR without a NEXT.
Yeah. You need to read through the code and figure out where to put that Next rCell statement.
It is most likely near the end of the code... but look and see where it looks like everything is done, and put the Next statement there.
-
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
That is right. The way the code works, is it just prints the rcell.value to the screen, sets SJOB =rcell.value, and then at the Next rCell line, it goes to the next cell. It's not actually doing anything beneath that.
The trick will be to comment out the "Next rCell" line
and find out where the end of the process is, and then on the next line add next rCell and see if that works.
If this thing is actively modifying files and such, I'd hightly recommend backing everything up before running it while you are working on that part.
Question...if I comment out the Next rCell line to test this, then what do I do with the FOR line? It will tell me there is a FOR without a NEXT.
Yeah. You need to read through the code and figure out where to put that Next rCell statement.
It is most likely near the end of the code... but look and see where it looks like everything is done, and put the Next statement there.
Gotcha...call me nuts but this is kind of fun...learning a lot and trying not to get frustrated at this crazy code...
-
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@garak0410 said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
@dafyre said in VBA Hint Needed - Change Way An Existing Project Grabs Data:
That is right. The way the code works, is it just prints the rcell.value to the screen, sets SJOB =rcell.value, and then at the Next rCell line, it goes to the next cell. It's not actually doing anything beneath that.
The trick will be to comment out the "Next rCell" line
and find out where the end of the process is, and then on the next line add next rCell and see if that works.
If this thing is actively modifying files and such, I'd hightly recommend backing everything up before running it while you are working on that part.
Question...if I comment out the Next rCell line to test this, then what do I do with the FOR line? It will tell me there is a FOR without a NEXT.
Yeah. You need to read through the code and figure out where to put that Next rCell statement.
It is most likely near the end of the code... but look and see where it looks like everything is done, and put the Next statement there.
Gotcha...call me nuts but this is kind of fun...learning a lot and trying not to get frustrated at this crazy code...
Welcome to the life of software development! lol. I actually enjoy it too.