Same Array/msgbox to display different messages

NatWally

New Member
Joined
Sep 19, 2018
Messages
26
Currently my array brings up three different msgboxes, as shown with the Functions 'Expired', 'Expiring', and 'NoTraining'. The array msgboxes display information based on whether a date is Expired (older than current date), Expiring (within 31 days), and is a date is missing (NoTraining).
No matter what, the msgboxes for the array will always come up, but will sometimes be blank (depending on the criteria in the SELECT CASE statement) and the following IF statement.
Does anyone know anyway of coding it so that if the msgboxes were to come up blank (if nothing fits the criteria), a different message will be shown in the box? I can't get the collection and boolean NoExpiredTraining to work properly bringing up an overall msgbox instead of the array msgboxes, so I need a message to appear in the Private Functions if there isn't going to be any data in the boxes (i.e. if the box would come up blank, then a "Everything okay" message)

This is my code:

Code:
[/FONT][/COLOR]
Sub Expire_New()


Dim arr()       As Variant
Dim msg(1 To 3) As String
Dim x           As Long
Dim nDx         As Long
Dim dDiff       As Long
LDays = 31


'I would recommend using a named sheet rather than
'ActiveSheet as this can change unexpectedly
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Support Staff")
With ws
    x = .Cells(.Rows.Count, TRAINING_DATE_COL).End(xlUp).Row
    arr = .Cells(21, 1).Resize(x - 20, 26).Value
End With


'I am a big fan of collections.  They make code easier to read
'and to implement.  The collection below will be scanned to
'see if there are any training dates that are set to expire within
'30 days or if there are people without any training
Dim colTrainingDate As Collection
Set colTrainingDate = CopyArrDimToCollection(arr, TRAINING_DATE_COL)


'This boolean will be used to control continued flow of the
'macro.  If NoExpiredTraining gets set to false, then there
'are people who must complete training.
'Dim NoExpiredTraining As Boolean: NoExpiredTraining = True


For x = LBound(arr, NAME_COL) To UBound(arr, NAME_COL)


    'Since every row requires a Name and Surname columns
    'to have data in them, let's check this first.
    'If a row doesn't have a name then skip it.
    If arr(x, NAME_COL) <> "" And arr(x, SURNAME_COL) <> "" Then


        'Always good practice to declare your variables/objects
        'relevant to where they will be used
        'vDx is an index used to loop through the collection of
        'Training Dates.  This is checking to see if any training
        'Dates are empty or less than 31 days from expiration
        Dim vDx As Variant
        For Each vDx In colTrainingDate
            If vDx = "" Then
                'blank date means needs training
                NoExpiredTraining = False
            ElseIf DateDiff("d", Date, vDx) < 31 Then
                'less than 31 days means needs training
                NoExpiredTraining = False
            End If
        Next


        'At this point you can determine if you want to continue
        'If there is no expired training, display the message and exit
        'the sub.
        If NoExpiredTraining Then
            'msg(4) = MsgBox("There are either no ...
            'is only used if want to do something based on
            'what button the user pressed.  Otherwise use
            'the Method form of MsgBox
            MsgBox "There are either no expired safeguarding certificates, or no certificate expiring within the next 31 days.", vbCritical, "Warning"
            Exit Sub
        Else
            'There is expired training.  Let's collect the status
            'of each individual
            If arr(x, TRAINING_DATE_COL) = "" Then
                'if the training date column is empty
                'put a really big default value in dDiff
                'otherwise you have to trap an error with DateDiff
                'and handle it
                dDiff = 100
            Else
                'training date column has a date value
                dDiff = DateDiff("d", Date, arr(x, TRAINING_DATE_COL))
            End If


            'Now let's see what the training status for the person is
            Select Case dDiff
                Case Is <= 0:   'Training is expired
                    msg(1) = Expired(msg(1), _
                          arr(x, NAME_COL), _
                          arr(x, 2), _
                          arr(x, TRAINING_DATE_COL))
                Case Is <= 31:  'Training is expiring
                    msg(2) = Expiring(msg(2), _
                          arr(x, NAME_COL), _
                          arr(x, 2), _
                          arr(x, TRAINING_DATE_COL), dDiff)
            End Select
            If Len(arr(x, 19)) = 0 And Len(arr(x, 1)) > 0 And Len(arr(x, 2)) > 0 Then
         msg(3) = NoTraining(msg(3), arr(x, 1), arr(x, 2), arr(x, 18))


  End If
  End If
  End If




 Next x
'Because of the Exit Sub statement above, the code bwlow
'will only execute if there are expired, expiring or missing
'training
For x = LBound(msg) To UBound(msg)
    msg(x) = Replace(msg(x), "@NL", vbCrLf)
    If Len(msg(x)) < 1024 Then
        MsgBox msg(x), vbExclamation, "Safeguarding Certificate Notification"
    Else
       MsgBox "String length for notification too long to fit into this MessageBox", vbExclamation, "Invalid String Length to Display"
    End If
Next x








Erase arr
Erase msg


End Sub


'***************************************************************************
'**
'** This fucntion copies all rows of data for the column specified into
'** a collection
Private Function CopyArrDimToCollection(ByRef mMultiDimArray() As Variant, _
                                    ByVal mColumnToCopy As Long) As Collection
Dim retVal As New Collection
Dim nDx As Long


For nDx = LBound(mMultiDimArray, 1) To UBound(mMultiDimArray, 1)
    retVal.Add mMultiDimArray(nDx, mColumnToCopy)
Next
Set CopyArrDimToCollection = retVal


End Function


Private Function Expired(ByRef msg As String, ByRef var1 As Variant, ByRef var2 As Variant, ByRef var3 As Variant) As String


If Len(msg) = 0 Then msg = "Persons with EXPIRED Safeguading Certificates@NL@NL"


Expired = msg & "(@var3) @var1 @var2@NL"
Expired = Replace(Expired, "@var1", var1)
Expired = Replace(Expired, "@var2", var2)
Expired = Replace(Expired, "@var3", var3)




End Function


Private Function Expiring(ByRef msg As String, ByRef var1 As Variant, ByRef var2 As Variant, ByRef var3 As Variant, ByRef d As Long) As String


If Len(msg) = 0 Then msg = "Persons with EXPIRING Safeguarding Certificates@NL@NL"


Expiring = msg & "(@var3) @var1 @var2 (@d days remaining)@NL"
Expiring = Replace(Expiring, "@var1", var1)
Expiring = Replace(Expiring, "@var2", var2)
Expiring = Replace(Expiring, "@var3", var3)
Expiring = Replace(Expiring, "@d", d)


End Function


Private Function NoTraining(ByRef msg As String, ByRef var1 As Variant, ByRef var2 As Variant, ByRef var3 As Variant) As String


If Len(msg) = 0 Then msg = "SAFEGUARDING TRAINING NOT COMPLETED FOR @NL@NL"


NoTraining = msg & " @var1 @var2@NL"
NoTraining = Replace(NoTraining, "@var1", var1)
NoTraining = Replace(NoTraining, "@var2", var2)
NoTraining = Replace(NoTraining, "@var3", var3)


End Function

 

Excel Facts

What is the fastest way to copy a formula?
If A2:A50000 contain data. Enter a formula in B2. Select B2. Double-click the Fill Handle and Excel will shoot the formula down to B50000.
Looks to me like your functions return strings, and you can test for them being "" (zero length) and use If block to customize the message accordingly. However, if you prepend your message with some text like "Here are the expired items:..." then it will never be "". Rather, I might use 2 string variables for each scenario; one for the preamble, one for the list of items and then concatenate them only if the items variable is "". Otherwise, I'd present the alternate message when list variable is "".

Looks to me like you have rem'd out NoExpiredTraining variable but are still trying to use it. I consider myself to be fairly proficient with Access vba and one thing I learned is to always "Require Variable Declaration (this puts Option Explicit at the top of every module) so that such errors are caught when the code is compiled. All in all, it looks overly complicated when (I think) you could simply find the values that you're interested in, concatenate them to a variable and message box it - no collections, no arrays.
 
Upvote 0
Thanks for your advice.

Do you have an example of it with my code where it could be changed?
I'm trying to work out where I would need to do it.
 
Upvote 0
So I have actually now managed to fix most of the issues by doing it this way.
However,that last thing I can't fix is to get a separate message to appear in the boxes if there is going to be no data dragged through from the array.

My main code is below:
Code:
'In this case use of the ActiveSheet
    'is ok since the button pressed
    'is on the ActiveSheet






'**************************************************************************
'**
'** This sub takes two parameters:
'**     ws as Worksheet is the Worksheet object passed from the calling
'**     routine
'**     mTitleFirstHeadingColumn as string is the title of the first column
'**         in the training table on every sheet.  THis was added because
'**         on one sheet the value is First Name on other sheets it's Name
Public Sub Expire_New(ByRef ws As Worksheet, ByVal Name As String)


    Dim msg(1 To 3) As String
    Dim x           As Long
    Dim nDx         As Long
    Dim dDiff       As Long


    'Establish the location of the first cell (range) of the Safegaurding Training block
    'Find the first instance of Safeguarding Training on the sheet
    Dim sgTrainingCol As Range
    With ws.Range("A1:AA1000")  'Using something large to provide a range to search
        Set sgTrainingCol = .Find("Safeguarding Training", LookIn:=xlValues)
    End With


    'Establish the location of the first cell (range) of the heading column
    'for the table on the sheet. Find the first instance of what is contained
    'in mTitleFirstHeadingColumn
    Dim HeadingRangeStart As Range
    With ws.Range("A1:AA1000")  'Using something large to provide a range to search
        Set HeadingRangeStart = .Find(Name, LookIn:=xlValues)
    End With


    Dim TrainingInfoRange As Range
    Dim personFNSR As Range
    With ws
        'finds the last row of the Heading column that has data, there can NOT be any empty rows
        'in the middle of this search.  It assumes that the name column date is contigous until
        'reaching the end of the data set.
        x = .Cells(HeadingRangeStart.Row, HeadingRangeStart.Column).End(xlDown).Row
        'Set the TrainingInfoRange to point to the data contained in the 4 columns under Safeguarding Training
        Set TrainingInfoRange = .Range(.Cells(sgTrainingCol.Row + 2, sgTrainingCol.Column), .Cells(x, sgTrainingCol.Column + 3))
        'Set pseronFNSR to the First Name/Name, Surname range
        Set personFNSR = .Range(.Cells(HeadingRangeStart.Row + 1, HeadingRangeStart.Column), .Cells(x, HeadingRangeStart.Column + 1))
    End With


    'I am a big fan of collections and scripting dictionaries.
    'They make code easier to read and to implement.
    Dim trainingDate As Scripting.Dictionary
    Set trainingDate = CopyRngDimToCollection(personFNSR, TrainingInfoRange)


    'This boolean will be used to control continued flow of the
    'macro.  If NoExpiredTraining gets set to false, then there
    'are people who must complete training.
    Dim NoExpiredTraining As Boolean: NoExpiredTraining = True


    'person training inquiry object - see class definition
    Dim personInquiryTraining As clPersonTraining


    'this is an index variable used to loop through items
    'contained in the Scripting Dictionary object
    Dim Key As Variant


    For Each Key In trainingDate.Keys
        'Assing the next object in the trainingDate Scripting Dictionary
        'to the person training inquiry object
        Set personInquiryTraining = trainingDate(Key)
        'Check to see if there are any training issues
        'if so, then set NoExpiredTraining to False
        'because there is expired, expiring or missing training
        If personInquiryTraining.ExpiringTraining _
          Or personInquiryTraining.NoTraining _
          Or personInquiryTraining.TrainingExpired Then
            NoExpiredTraining = False
        End If
    Next


    If NoExpiredTraining Then
        'msg(4) = MsgBox("There are either no ...
        'is only used if want to do something based on
        'what button the user pressed.  Otherwise use
        'the Method form of MsgBox
        MsgBox "There are either no expired safeguarding certificates, " _
             & "or no certificate expiring within the next 31 days.", _
             vbCritical, "Warning"
        Exit Sub
    End If


    'If this code executes, then there is expired training.
    'Let's collect the status for each individual
    For Each Key In trainingDate.Keys
        Set personInquiryTraining = trainingDate(Key)
        If personInquiryTraining.TrainingExpired _
          And personInquiryTraining.trainingDate <> DateSerial(1900, 1, 1) Then 'Training is expired
            msg(1) = Expired(msg(1), _
                  personInquiryTraining.firstName, _
                  personInquiryTraining.surName, _
                  personInquiryTraining.trainingExpiryDate)
        End If
        If personInquiryTraining.ExpiringTraining _
          And personInquiryTraining.trainingExpiryDate <> DateSerial(1900, 1, 1) Then 'Training is expiring
            msg(2) = Expiring(msg(2), _
                  personInquiryTraining.firstName, _
                  personInquiryTraining.surName, _
                  personInquiryTraining.trainingExpiryDate, _
                  DateDiff("d", Date, personInquiryTraining.trainingExpiryDate))
        End If
        If personInquiryTraining.NoTraining Then 'Training is None
            msg(3) = NoTraining(msg(3), _
                  personInquiryTraining.firstName, _
                  personInquiryTraining.surName, _
                  "NONE")
        End If
    Next


    'Because of the Exit Sub statement above, the code bwlow
    'will only execute if there are expired, expiring or missing
    'training
    For x = LBound(msg) To UBound(msg)
        msg(x) = Replace(msg(x), "@NL", vbCrLf)
        If Len(msg(x)) < 1024 Then
            MsgBox msg(x), vbExclamation, "Safeguarding Certificate Notification"
        Else
            MsgBox "String length for notification too long to fit into this MessageBox", vbExclamation, "Invalid String Length to Display"
        End If
    Next x


End Sub


'***************************************************************************
'**
'** This fucntion copies all rows of data for the column specified into
'** a scripting dictionary
Private Function CopyRngDimToCollection(ByRef mFNSR As Range, ByRef mTrainInfo) As Scripting.Dictionary


    Dim retVal As New Scripting.Dictionary
    'nDx will become a key for each of the scripting dictionary items
    Dim nDx As Long: nDx = 1
    'person training inquiry object - see class definition
    Dim personTraining As clPersonTraining


    Dim mRow As Range
    For Each mRow In mFNSR.Rows
        'instantiate a new person training inquiry object
        Set personTraining = New clPersonTraining
        With personTraining
            .firstName = mRow.Value2(1, 1)
            .surName = mRow.Value2(1, 2)
        End With
        retVal.Add nDx, personTraining
        nDx = nDx + 1
    Next
    nDx = 1


    For Each mRow In mTrainInfo.Rows
        'Retreive the person training inquiry object
        'from the scripting dictionary (retVal)
        Set personTraining = retVal(nDx)


        'Add the training data information to
        'the person training inquiry object
        With personTraining
            'Next two equations determine if the excel range has a null value
            'if so then the person training inquiry object's date field is set to a
            'default value of 1-1-1900 - this could be any valid date
            'otherwise the value is set to what is in the excel range from the sheet
            .trainingDate = IIf(mRow.Value2(1, 1) = vbNullString, DateSerial(1900, 1, 1), mRow.Value2(1, 1))
            .trainingExpiryDate = IIf(mRow.Value2(1, 2) = vbNullString, DateSerial(1900, 1, 1), mRow.Value2(1, 2))
            .trainingLevel = mRow.Value2(1, 3)
            .certSeenBy = mRow.Value2(1, 4)
        End With
        'Update the object stored at the current key location
        'given by the value of nDx
        Set retVal(nDx) = personTraining
        nDx = nDx + 1
    Next


    'Set the return value for the function
    Set CopyRngDimToCollection = retVal


End Function


Private Function Expired(ByRef msg As String, ByRef var1 As Variant, ByRef var2 As Variant, ByRef var3 As Variant) As String


If Len(msg) = 0 Then msg = "Persons with EXPIRED Safeguading Certificates@NL@NL"


    Expired = msg & "(@var3) @var1 @var2@NL"
    Expired = Replace(Expired, "@var1", var1)
    Expired = Replace(Expired, "@var2", var2)
    Expired = Replace(Expired, "@var3", var3)


End Function


Private Function Expiring(ByRef msg As String, ByRef var1 As Variant, ByRef var2 As Variant, ByRef var3 As Variant, ByRef d As Long) As String


    If Len(msg) = 0 Then msg = "Persons with EXPIRING Safeguarding Certificates@NL@NL"


    Expiring = msg & "(@var3) @var1 @var2 (@d days remaining)@NL"
    Expiring = Replace(Expiring, "@var1", var1)
    Expiring = Replace(Expiring, "@var2", var2)
    Expiring = Replace(Expiring, "@var3", var3)
    Expiring = Replace(Expiring, "@d", d)


End Function


Private Function NoTraining(ByRef msg As String, ByRef var1 As Variant, ByRef var2 As Variant, ByRef var3 As Variant) As String


    If Len(msg) = 0 Then msg = "SAFEGUARDING TRAINING NOT COMPLETED FOR @NL@NL"


    NoTraining = msg & " @var1 @var2@NL"
    NoTraining = Replace(NoTraining, "@var1", var1)
    NoTraining = Replace(NoTraining, "@var2", var2)
    NoTraining = Replace(NoTraining, "@var3", var3)


End Function

And then this is the Class Module that is used:

Code:
ption Explicit

Public firstName As String
Public surName As String
Public trainingDate As Date
Public trainingExpiryDate As Date
Public trainingLevel As String
Public certSeenBy As String
Public dDiff As Long




Public Property Get TrainingExpired() As Boolean


    If DateDiff("d", Date, trainingExpiryDate) <= 0 Then
        TrainingExpired = True
    Else
        TrainingExpired = False
    End If


End Property
Public Property Get ExpiringTraining() As Boolean
    If DateDiff("d", Date, trainingExpiryDate) > 0 Then
    dDiff = DateDiff("d", Date, trainingExpiryDate)
    Select Case dDiff
    Case Is <= 31
        ExpiringTraining = True
    Case Else
        ExpiringTraining = False
    End Select
    End If
End Property


Public Property Get NoTraining() As Boolean
    If trainingDate = DateSerial(1900, 1, 1) Then
        NoTraining = True
    Else
        NoTraining = False
    End If
End Property
 
Last edited:
Upvote 0
Thanks for your advice.

Do you have an example of it with my code where it could be changed?
I'm trying to work out where I would need to do it.
A bit hard for me to visualize exactly what's going on without the workbook, but I can provide a generic example. You'd need to figure out how to incorporate the method while knowing where and how your values come in but without bothering to create a class or collection. Basically, you'd add them to a string variable instead. I suppose you could stick with the array for the sake of expediency.

Code:
Dim strValues As String

For nDx = LBound(mMultiDimArray, 1) To UBound(mMultiDimArray, 1)
     strValues = strValues & mMultiDimArray(nDx, mColumnToCopy) & "; )"
  'or could use line wraps instead of colon separators
  'strValues = strValues & mMultiDimArray(nDx, mColumnToCopy ) & vbCrLf
Next

more code?

MsgBox "message for this issue:" & strValues

I'm afraid I'm not cluing in to the part that distinguishes the dates from one another or I've forgotten. The longer a post gets, the harder it is to go back and review while trying to compose. You could also pass this concatenated string and a date (if I understand) to a function to build the message box, like
Code:
Function BuildMsgBox (strValues As String, dteDate as Date) As String
'assume we pass "Joe; Mary; Sam", #10/09/2018# 
Select Case dteDate
  Case Is < Date() 
    msgbox "message for this issue:" & dteDate & strValues
  Case Is > #some  date# And < #some  date#
    msgbox "message for this issue:" & dteDate  & strValues
  Case ....
End Select

End Function
Hope some of that helps
 
Last edited:
Upvote 0
So Private Function Expired, pulls through any date that is older than the current date.
Private Function Expiring, pulls through any dates that are within 31 days of the current date (within 31 days of the future)
Private Function NoTraining, pulls through any names that do not have a date associated with them

The functions will be called no matter what, and so their respective msgbox will always come up. However, say the msbox for Expired came up, but there was actually no Expired dates, then this msgbox would contain no information other than the title as listed here:
Code:
For x = LBound(msg) To UBound(msg)        msg(x) = Replace(msg(x), "@NL", vbCrLf)
        If Len(msg(x)) < 1024 Then
           [B] MsgBox msg(x), vbExclamation, "Safeguarding Certificate Notification[/B]"
        Else
            MsgBox "String length for notification too long to fit into this MessageBox", vbExclamation, "Invalid String Length to Display"
        End If
    Next x

I think the problem must lie within the functions themselves. It would need something inside the function to decide that if there was no data going to be pulled through, the msgbox would need to contain alternative text.
It must be something to do with the IF statement in each function: (this example is the EXPIRED function)

Code:
[B]If Len(msg) = 0 Then msg = "Persons with EXPIRED Safeguading Certificates@NL@NL"[/B]
    Expired = msg & "(@var3) @var1 @var2@NL"
    Expired = Replace(Expired, "@var1", var1)
    Expired = Replace(Expired, "@var2", var2)
    Expired = Replace(Expired, "@var3", var3)

If you or anyone has any ideas with this code and how to sort it, that would be amazing!
 
Last edited:
Upvote 0
can you post a table of sample data that has several rows/records that satisfy all 3 scenarios as well as instructions on how to set up any pertinent requirements such as sheet/workbook names, file paths, etc.? I find the easiest is to center data in Excel columns, copy/paste range to forum. You can't post attachments in this forum and I don't want to have to type out anything you might show as an image. I'd be willing to look into the problem if I had something to work with. The code I can copy from your posts.
 
Upvote 0
Hi Micron,

So I have managed to get a message to appear in the boxes, they will always appear regardless. They also do not always appear correctly. I think this must be down to the way the SELECT CASE I have here works:

Code:
For x = LBound(msg) To UBound(msg)        msg(x) = Replace(msg(x), "@NL", vbCrLf)
        If Len(msg(x)) < 1024 Then
        Select Case msg(x)
        Case msg(1)
            MsgBox "(If this box is blank, there is nothing Expired)" & vbCrLf & vbCrLf & msg(x), vbExclamation, "Safeguarding Certificate Notification"
        Case msg(2)
            MsgBox "(If this box is blank, there is nothing Expiring)" & vbCrLf & vbCrLf & msg(x), vbExclamation, "Safeguarding Certificate Notification"
        Case msg(3)
           MsgBox "(If this box is blank, there is nothing Missing)" & vbCrLf & vbCrLf & msg(x), vbExclamation, "Safeguarding Certificate Notification"
        End Select
        Else
            MsgBox "String length for notification too long to fit into this MessageBox", vbExclamation, "Invalid String Length to Display"
        End If


    Next x


End Sub

Here are the scenarios in which it works incorrectly. All three boxes will appear no matter what, it just doesn't display the correct message. Order of messages (EXPIRED, EXPIRING, NOTRAINING).


  • If a date is just EXPIRED, and not EXPIRING or NOTRAINING, then msg(2) comes up for the second and third msgbox - msg(3) should come up for the third one.
  • If a date is just EXPIRING, and not EXPIRED or NOTRAINING, then msg(1) comes up for both the first and third msgbox - should only come up for the first one, and msg(3) should come up for third one.
  • If a date is just missing (NOTRAINING), and not EXPIRED or EXPIRING, then msg(1) comes up for both the first and second msgbox - msg(2) should come up for the second msgbox.

You will probably know more than me on how a SELECT CASE works, and so you may find a better way of doing it and getting it to work correctly.

The dropbox link contains the excel workbook - please only use the Support Staff sheet. https://www.dropbox.com/s/9q6ss19myo4ppza/SCR as of 17 09 18 - Copy - Copy.xlsm?dl=0
There should currently be data that satisfies EXPIRED, EXPIRING, and NOTRAINING. If you want to have a play around and test it out, please change the dates in column R. If you want to test for NOTRAINING, you will either need to add text in column A or B, or remove the text 'Name' and 'Missing' from column A and B. Do not then add a date in column R - basically, if there is a name in A and B and no date in R, then NOTRAINING will be satisfied.
 
Upvote 0
If we're going to go the drop box route, you might as well upload a copy (strip out private info) of the workbook. I started to work with the data thinking I would replicate your wb without too much trouble, but upon reviewing the code, I think it's too fractured now, plus I'm not sure which part is which as the same procedures seem to have different names. As soon as I ran into a part that says "ok to use active sheet because button is on active sheet" it became apparent to me that this leaves too much room for error on my part.
 
Upvote 0
Hi Micron,

There is no private data. All the names are made up and the dates are random. I think it is just the SELECT CASE that needs changing, so the rest of the code shouldn't matter. It's just how to get those messages always displaying correctly.
 
Upvote 0

Forum statistics

Threads
1,223,164
Messages
6,170,444
Members
452,326
Latest member
johnshaji

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top