Search code examples
ms-accessvbams-access-97

Why does Join()-ing a Split() with limit 64 return more than 64 substrings?


I have to limit a string to a maximum of 64 substrings, which are divided by ;. The input string contains 113 substrings:

x2BlackList = "mcc=206,mnc=1,mncLength=2,enbId=180096;mcc=206,mnc=1,mncLength=2,enbId=80459;mcc=206,mnc=1,mncLength=2,enbId=84604;mcc=206,mnc=1,mncLength=2,enbId=180166;mcc=206,mnc=1,mncLength=2,enbId=80279;mcc=206,mnc=1,mncLength=2,enbId=80288;mcc=206,mnc=1,mncLength=2,enbId=80457;mcc=208,mnc=10,mncLength=2,enbId=4791;mcc=206,mnc=1,mncLength=2,enbId=80197;mcc=206,mnc=1,mncLength=2,enbId=80188;mcc=206,mnc=1,mncLength=2,enbId=80195;mcc=206,mnc=1,mncLength=2,enbId=80206;mcc=206,mnc=1,mncLength=2,enbId=181309;mcc=206,mnc=1,mncLength=2,enbId=181218;mcc=206,mnc=1,mncLength=2,enbId=180254;mcc=206,mnc=1,mncLength=2,enbId=80332;mcc=206,mnc=1,mncLength=2,enbId=180340;mcc=206,mnc=1,mncLength=2,enbId=83355;mcc=206,mnc=1,mncLength=2,enbId=180367;mcc=206,mnc=1,mncLength=2,enbId=181222;mcc=206,mnc=1,mncLength=2,enbId=83887;mcc=206,mnc=1,mncLength=2,enbId=181026;mcc=206,mnc=1,mncLength=2,enbId=180356;mcc=206,mnc=1,mncLength=2,enbId=181001;mcc=206,mnc=1,mncLength=2,enbId=84624;mcc=206,mnc=1,mncLength=2,enbId=80209;mcc=206,mnc=1,mncLength=2,enbId=80318;mcc=206,mnc=1,mncLength=2,enbId=80454;mcc=206,mnc=1,mncLength=2,enbId=80471;mcc=206,mnc=1,mncLength=2,enbId=80476;mcc=206,mnc=1,mncLength=2,enbId=80486;mcc=206,mnc=1,mncLength=2,enbId=80526;mcc=206,mnc=1,mncLength=2,enbId=80445;mcc=206,mnc=1,mncLength=2,enbId=80586;mcc=206,mnc=1,mncLength=2,enbId=80212;mcc=206,mnc=1,mncLength=2,enbId=80189;mcc=206,mnc=1,mncLength=2,enbId=80453;mcc=206,mnc=1,mncLength=2,enbId=80474;mcc=206,mnc=1,mncLength=2,enbId=80191;mcc=206,mnc=1,mncLength=2,enbId=181230;mcc=206,mnc=1,mncLength=2,enbId=181394;mcc=206,mnc=1,mncLength=2,enbId=181401;mcc=206,mnc=1,mncLength=2,enbId=83338;mcc=206,mnc=1,mncLength=2,enbId=83395;mcc=206,mnc=1,mncLength=2,enbId=83415;mcc=206,mnc=1,mncLength=2,enbId=180381;mcc=206,mnc=1,mncLength=2,enbId=80180;mcc=206,mnc=1,mncLength=2,enbId=80196;mcc=206,mnc=1,mncLength=2,enbId=80484;mcc=206,mnc=1,mncLength=2,enbId=80204;mcc=206,mnc=1,mncLength=2,enbId=80464;mcc=206,mnc=1,mncLength=2,enbId=80314;mcc=206,mnc=1,mncLength=2,enbId=84580;mcc=206,mnc=1,mncLength=2,enbId=80520;mcc=206,mnc=1,mncLength=2,enbId=83387;mcc=206,mnc=1,mncLength=2,enbId=83376;mcc=206,mnc=1,mncLength=2,enbId=83397;mcc=206,mnc=1,mncLength=2,enbId=83439;mcc=206,mnc=1,mncLength=2,enbId=80324;mcc=206,mnc=1,mncLength=2,enbId=180094;mcc=206,mnc=1,mncLength=2,enbId=80291;mcc=206,mnc=1,mncLength=2,enbId=80293;mcc=206,mnc=1,mncLength=2,enbId=80297;mcc=206,mnc=1,mncLength=2,enbId=80299;mcc=206,mnc=1,mncLength=2,enbId=80307;mcc=206,mnc=1,mncLength=2,enbId=80458;mcc=206,mnc=1,mncLength=2,enbId=80473;mcc=206,mnc=1,mncLength=2,enbId=80502;mcc=206,mnc=1,mncLength=2,enbId=80517;mcc=206,mnc=1,mncLength=2,enbId=80540;mcc=206,mnc=1,mncLength=2,enbId=80583;mcc=206,mnc=1,mncLength=2,enbId=83815;mcc=206,mnc=1,mncLength=2,enbId=83818;mcc=206,mnc=1,mncLength=2,enbId=83823;mcc=206,mnc=1,mncLength=2,enbId=83834;mcc=206,mnc=1,mncLength=2,enbId=84006;mcc=206,mnc=1,mncLength=2,enbId=84018;mcc=206,mnc=1,mncLength=2,enbId=84594;mcc=206,mnc=1,mncLength=2,enbId=84605;mcc=206,mnc=1,mncLength=2,enbId=84610;mcc=206,mnc=1,mncLength=2,enbId=180514;mcc=206,mnc=1,mncLength=2,enbId=180519;mcc=206,mnc=1,mncLength=2,enbId=180523;mcc=206,mnc=1,mncLength=2,enbId=180528;mcc=206,mnc=1,mncLength=2,enbId=180530;mcc=206,mnc=1,mncLength=2,enbId=180611;mcc=206,mnc=1,mncLength=2,enbId=180612;mcc=206,mnc=1,mncLength=2,enbId=180616;mcc=206,mnc=1,mncLength=2,enbId=180618;mcc=206,mnc=1,mncLength=2,enbId=180619;mcc=206,mnc=1,mncLength=2,enbId=180620;mcc=206,mnc=1,mncLength=2,enbId=180623;mcc=206,mnc=1,mncLength=2,enbId=180625;mcc=206,mnc=1,mncLength=2,enbId=180629;mcc=206,mnc=1,mncLength=2,enbId=180814;mcc=206,mnc=1,mncLength=2,enbId=181254;mcc=206,mnc=1,mncLength=2,enbId=181275;mcc=206,mnc=1,mncLength=2,enbId=181466;mcc=206,mnc=1,mncLength=2,enbId=181482;mcc=206,mnc=1,mncLength=2,enbId=181648;mcc=206,mnc=1,mncLength=2,enbId=181737;mcc=234,mnc=10,mncLength=2,enbId=504599;mcc=234,mnc=10,mncLength=2,enbId=504699;mcc=234,mnc=10,mncLength=2,enbId=505533;mcc=234,mnc=10,mncLength=2,enbId=505559;mcc=234,mnc=10,mncLength=2,enbId=505563;mcc=234,mnc=10,mncLength=2,enbId=505627;mcc=234,mnc=10,mncLength=2,enbId=505711;mcc=234,mnc=10,mncLength=2,enbId=505805;mcc=234,mnc=10,mncLength=2,enbId=506130;mcc=234,mnc=10,mncLength=2,enbId=506624;mcc=234,mnc=10,mncLength=2,enbId=506752;mcc=234,mnc=10,mncLength=2,enbId=506888"

Using Split I can limit the number of substrings to 64:

Dim List() As String, _
    Item As Variant, _
    Counter As Long
Counter = 0
List = Split(x2BlackList, ";", 64)
For Each Item In List
    Counter = Counter + 1
Next
Debug.Print Counter

The debug window indicates 64 elements counted. Using Join I want to put these 64 elements into a string with ; as separator:

NewBlackList = Join(List, ";")
Debug.Print NewBlackList

But NewBlackList contains all 113 substrings. I have tried the above code, and also the simplified version below (which I would prefer to use), but both do not limit the string to 64 substrings.

SetBlackList = Join(Split(x2BlackList, ";", 64), ";")

Why does Join()ing a Split(,,64) return more than 64 substrings?


Solution

  • The third parameter of the Split() function places a limit on the number of elements returned. It does not, however, mean that further elements are lost. They are all returned unsplit in the last element.

    As such, you are splitting your string into a maximum of 64 substrings. In this case, the 64th element is the unsplit value of what would be elements 64 to 113.

    When you run Join() on the resultant array, you will get the original string back.

    What you need to do is Split() the string and then discard the elements you do not want:

    List = Split(x2BlackList, ";")
    
    If UBound(List) > 63 Then
        ReDim Preserve List(63)
    End If
    
    NewBlackList = Join(List, ";")