Do While on Two Conditions









up vote
1
down vote

favorite
1












I have this Do While loop:



Sub TEST_LOOP()
Dim i As Integer
i = 2

Do While Cells(i, 3) <> "" And _
Int(Mid(Cells(i, 3), 12, 2)) = 21
Value = Value + Cells(i, 4)
i = i + 1
Loop

End Sub


Which is applied to this basic data set:
enter image description here



I get an error message:




"Run-time error '13': Type mismatch.




The problem happens because when the loop reaches the first empty cell (i = 7)
then the Int function is applied to an empty value Mid(Cells(i, 3), 12, 2 gives nothing). So I was wondering whether there was an efficient way to exit the loop once the cell in question does not meet the two conditions, that is it is not empty and it involves the hour 21.










share|improve this question























  • Unfortunately VBA doesn't have continue or break statements. See stackoverflow.com/a/12960972 for a solution.
    – Robert Harvey
    Nov 8 at 20:14















up vote
1
down vote

favorite
1












I have this Do While loop:



Sub TEST_LOOP()
Dim i As Integer
i = 2

Do While Cells(i, 3) <> "" And _
Int(Mid(Cells(i, 3), 12, 2)) = 21
Value = Value + Cells(i, 4)
i = i + 1
Loop

End Sub


Which is applied to this basic data set:
enter image description here



I get an error message:




"Run-time error '13': Type mismatch.




The problem happens because when the loop reaches the first empty cell (i = 7)
then the Int function is applied to an empty value Mid(Cells(i, 3), 12, 2 gives nothing). So I was wondering whether there was an efficient way to exit the loop once the cell in question does not meet the two conditions, that is it is not empty and it involves the hour 21.










share|improve this question























  • Unfortunately VBA doesn't have continue or break statements. See stackoverflow.com/a/12960972 for a solution.
    – Robert Harvey
    Nov 8 at 20:14













up vote
1
down vote

favorite
1









up vote
1
down vote

favorite
1






1





I have this Do While loop:



Sub TEST_LOOP()
Dim i As Integer
i = 2

Do While Cells(i, 3) <> "" And _
Int(Mid(Cells(i, 3), 12, 2)) = 21
Value = Value + Cells(i, 4)
i = i + 1
Loop

End Sub


Which is applied to this basic data set:
enter image description here



I get an error message:




"Run-time error '13': Type mismatch.




The problem happens because when the loop reaches the first empty cell (i = 7)
then the Int function is applied to an empty value Mid(Cells(i, 3), 12, 2 gives nothing). So I was wondering whether there was an efficient way to exit the loop once the cell in question does not meet the two conditions, that is it is not empty and it involves the hour 21.










share|improve this question















I have this Do While loop:



Sub TEST_LOOP()
Dim i As Integer
i = 2

Do While Cells(i, 3) <> "" And _
Int(Mid(Cells(i, 3), 12, 2)) = 21
Value = Value + Cells(i, 4)
i = i + 1
Loop

End Sub


Which is applied to this basic data set:
enter image description here



I get an error message:




"Run-time error '13': Type mismatch.




The problem happens because when the loop reaches the first empty cell (i = 7)
then the Int function is applied to an empty value Mid(Cells(i, 3), 12, 2 gives nothing). So I was wondering whether there was an efficient way to exit the loop once the cell in question does not meet the two conditions, that is it is not empty and it involves the hour 21.







excel-vba while-loop






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 8 at 20:12









K.Dᴀᴠɪs

5,940102140




5,940102140










asked Nov 8 at 20:09









Alan

113




113











  • Unfortunately VBA doesn't have continue or break statements. See stackoverflow.com/a/12960972 for a solution.
    – Robert Harvey
    Nov 8 at 20:14

















  • Unfortunately VBA doesn't have continue or break statements. See stackoverflow.com/a/12960972 for a solution.
    – Robert Harvey
    Nov 8 at 20:14
















Unfortunately VBA doesn't have continue or break statements. See stackoverflow.com/a/12960972 for a solution.
– Robert Harvey
Nov 8 at 20:14





Unfortunately VBA doesn't have continue or break statements. See stackoverflow.com/a/12960972 for a solution.
– Robert Harvey
Nov 8 at 20:14













1 Answer
1






active

oldest

votes

















up vote
1
down vote



accepted










You need to check if the cell value is a date first, then proceed. See if this helps:



Sub TEST_LOOP()

Dim i As Long, ws As Worksheet
Set ws = ActiveSheet

For i = 2 To lastRow(ws, "C")
If isDate(ws.Cells(i, 3)) Then

If Int(Mid(ws.Cells(i, 3), 12, 2)) = 21 Then

Value = Value + ws.Cells(i, 4)

End If

End If
Next i

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
With ws
lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
End With
End Function


The issue is that in an IF() or Do While statement, everything is evaluated - even if a previous statement returns FALSE. So you will need to first check if your cell is a date before trying to proceed.






share|improve this answer






















  • Thanks very much K.Davis, it works perfectly! Best
    – Alan
    Nov 9 at 15:22










Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53215398%2fdo-while-on-two-conditions%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
1
down vote



accepted










You need to check if the cell value is a date first, then proceed. See if this helps:



Sub TEST_LOOP()

Dim i As Long, ws As Worksheet
Set ws = ActiveSheet

For i = 2 To lastRow(ws, "C")
If isDate(ws.Cells(i, 3)) Then

If Int(Mid(ws.Cells(i, 3), 12, 2)) = 21 Then

Value = Value + ws.Cells(i, 4)

End If

End If
Next i

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
With ws
lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
End With
End Function


The issue is that in an IF() or Do While statement, everything is evaluated - even if a previous statement returns FALSE. So you will need to first check if your cell is a date before trying to proceed.






share|improve this answer






















  • Thanks very much K.Davis, it works perfectly! Best
    – Alan
    Nov 9 at 15:22














up vote
1
down vote



accepted










You need to check if the cell value is a date first, then proceed. See if this helps:



Sub TEST_LOOP()

Dim i As Long, ws As Worksheet
Set ws = ActiveSheet

For i = 2 To lastRow(ws, "C")
If isDate(ws.Cells(i, 3)) Then

If Int(Mid(ws.Cells(i, 3), 12, 2)) = 21 Then

Value = Value + ws.Cells(i, 4)

End If

End If
Next i

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
With ws
lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
End With
End Function


The issue is that in an IF() or Do While statement, everything is evaluated - even if a previous statement returns FALSE. So you will need to first check if your cell is a date before trying to proceed.






share|improve this answer






















  • Thanks very much K.Davis, it works perfectly! Best
    – Alan
    Nov 9 at 15:22












up vote
1
down vote



accepted







up vote
1
down vote



accepted






You need to check if the cell value is a date first, then proceed. See if this helps:



Sub TEST_LOOP()

Dim i As Long, ws As Worksheet
Set ws = ActiveSheet

For i = 2 To lastRow(ws, "C")
If isDate(ws.Cells(i, 3)) Then

If Int(Mid(ws.Cells(i, 3), 12, 2)) = 21 Then

Value = Value + ws.Cells(i, 4)

End If

End If
Next i

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
With ws
lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
End With
End Function


The issue is that in an IF() or Do While statement, everything is evaluated - even if a previous statement returns FALSE. So you will need to first check if your cell is a date before trying to proceed.






share|improve this answer














You need to check if the cell value is a date first, then proceed. See if this helps:



Sub TEST_LOOP()

Dim i As Long, ws As Worksheet
Set ws = ActiveSheet

For i = 2 To lastRow(ws, "C")
If isDate(ws.Cells(i, 3)) Then

If Int(Mid(ws.Cells(i, 3), 12, 2)) = 21 Then

Value = Value + ws.Cells(i, 4)

End If

End If
Next i

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
With ws
lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
End With
End Function


The issue is that in an IF() or Do While statement, everything is evaluated - even if a previous statement returns FALSE. So you will need to first check if your cell is a date before trying to proceed.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 8 at 20:29

























answered Nov 8 at 20:19









K.Dᴀᴠɪs

5,940102140




5,940102140











  • Thanks very much K.Davis, it works perfectly! Best
    – Alan
    Nov 9 at 15:22
















  • Thanks very much K.Davis, it works perfectly! Best
    – Alan
    Nov 9 at 15:22















Thanks very much K.Davis, it works perfectly! Best
– Alan
Nov 9 at 15:22




Thanks very much K.Davis, it works perfectly! Best
– Alan
Nov 9 at 15:22

















 

draft saved


draft discarded















































 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53215398%2fdo-while-on-two-conditions%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)