Option Explicit
Const lignes = 900000
Sub testW()
    Dim plage As Range, T As String, Tim#
    Set plage = [A1].Resize(lignes, 3)    ' preciser la plage ici (activesheet.usedrange pour tout la partie utilisée)
     Tim = Timer
     T = ConcatRange(plage, ";")
MsgBox "formule clipboard sur [A1].Resize(" & lignes & ", 3) :" & vbCrLf & Format(Timer - Tim, "#0.00 SEC") & vbCrLf & T
End Sub
Function ConcatRange(Rng, Optional separateur As String = ";", Optional chemin As String = "")
    Dim T, clearall
    With CreateObject("htmlfile")
        clearall = .parentwindow.clipboardData.setData("Text", "")    'on vide le clipboard au cas ou il y aurait quelque chose
        Rng.Copy    'on copy la plage tout simplement
        'on recupere le texte de la plage dans le cliboard on fait un replace vbtab par le separateur en parametre injecté dans la fonction";" par defaut
        T = Replace(Replace(.parentwindow.clipboardData.GetData("TEXT"), vbTab, separateur), vbCrLf, separateur & vbCrLf): End With
    T = Replace(T, vbCrLf, ";")
    Application.CutCopyMode = False    'on relache la plage copiée
    ConcatRange = T
End Function