Sub Transpose()

 

    'Auteur : JM CLIPET 29/09/2001 modifiée 29/10/2001

   

    ' Cette macro transpose les accords d'une grille (tableau) ou d'un morceau (texte)

    ' du nombre de demi-tons demandé. On doit choisir si on préfère obtenir

    ' des # ou des b

    ' Tout ce qui est en italique (Titres ou paroles...) n'est pas considéré comme accords

    ' et n'est donc pas transposé.

    ' De même tout ce qui est en exposant est considéré comme enrichissement et n'est donc pas transposé

    ' Par Ex Bb7 sera transposé mais pas B(exp b5)

 

    Dim Note1$(12)

    Note1$(1) = "C"

    Note1$(2) = "Db"

    Note1$(3) = "D"

    Note1$(4) = "Eb"

    Note1$(5) = "E"

    Note1$(6) = "F"

    Note1$(7) = "Gb"

    Note1$(8) = "G"

    Note1$(9) = "Ab"

    Note1$(10) = "A"

    Note1$(11) = "Bb"

    Note1$(12) = "B"

 

    Dim Note2$(12)

    Note2$(1) = "C"

    Note2$(2) = "C#"

    Note2$(3) = "D"

    Note2$(4) = "D#"

    Note2$(5) = "E"

    Note2$(6) = "F"

    Note2$(7) = "F#"

    Note2$(8) = "G"

    Note2$(9) = "G#"

    Note2$(10) = "A"

    Note2$(11) = "A#"

    Note2$(12) = "B"

   

    Dim Note3$(24)

    Note3$(1) = "T"

    Note3$(2) = "T#"

    Note3$(3) = "U"

    Note3$(4) = "U#"

    Note3$(5) = "V"

    Note3$(6) = "W"

    Note3$(7) = "W#"

    Note3$(8) = "X"

    Note3$(9) = "X#"

    Note3$(10) = "Y"

    Note3$(11) = "Y#"

    Note3$(12) = "Z"

    Note3$(13) = "T"

    Note3$(14) = "Ub"

    Note3$(15) = "U"

    Note3$(16) = "Vb"

    Note3$(17) = "V"

    Note3$(18) = "W"

    Note3$(19) = "Xb"

    Note3$(20) = "X"

    Note3$(21) = "Yb"

    Note3$(22) = "Y"

    Note3$(23) = "Zb"

    Note3$(24) = "Z"

   

    Dim ordre(12)

    ordre(1) = 2

    ordre(2) = 4

    ordre(3) = 7

    ordre(4) = 9

    ordre(5) = 11

    ordre(6) = 1

    ordre(7) = 3

    ordre(8) = 5

    ordre(9) = 6

    ordre(10) = 8

    ordre(11) = 10

    ordre(12) = 12

   

    If Selection.Type = wdSelectionIP Then

       MsgBox ("Veuillez sélectionner les accords à transposer")

       End

    End If

 

    t = Val(InputBox$("Tapez le nombre de demi-tons à transposer (positif ou négatif) : "))

    'replace t entre 1 et 12

    While (t <= 0)

        t = t + 12

    Wend

    While (t >= 12)

        t = t - 12

    Wend

 

    Reponse = MsgBox("Appréciez vous les bémols ?", vbYesNo, "Choix bémols ou dièses")

    If Reponse = vbYes Then bemol = 1 Else bemol = 0

 

    'supprime l'affichage en mode page pour ne pas perdre de temps avec la pagination

    temp = ActiveWindow.View.Type

    ActiveWindow.View.Type = wdNormalView

   

    Selection.Find.ClearFormatting

    Selection.Find.Font.Italic = False        'Ne modifie pas le texte en italique

    Selection.Find.Font.Superscript = False   'Ni les altérations en exposant

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Forward = True

        .Wrap = wdFindStop

        .Format = True

        .MatchCase = True

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

 

    Rem Remplace A - G  par T - Z transposés

    For i = 1 To 12

        Result = ordre(i) + t

        If Result > 12 Then Result = Result - 12

        With Selection.Find

            .Text = Note1$(ordre(i))

            .Replacement.Text = Note3$(Result + bemol * 12)

        End With

        Selection.Find.Execute Replace:=wdReplaceAll

        If (i <= 5) Then

            Rem EditionRemplacer .Rechercher = Note2$(ordre(i)), .Remplacer = Note3$(Result + bemol * 12), .Sens = 0, .RespecterLaCasse = 1, .MotEntier = 0, .CritèresSpéciaux = 1, .Réservé23 = 0, .RemplacerTout, .Format = 1, .RenvoiLigneAuto = 0

            With Selection.Find

                .Text = Note2$(ordre(i))

                .Replacement.Text = Note3$(Result + bemol * 12)

            End With

            Selection.Find.Execute Replace:=wdReplaceAll

        End If

    Next i

   

    Rem Remplace tous les T - Z par des A - G

    For i = 6 To 12

        With Selection.Find

            .Text = Note3$(ordre(i))

            .Replacement.Text = Note1$(ordre(i))

        End With

        Selection.Find.Execute Replace:=wdReplaceAll

    Next i

   

    ActiveWindow.View.Type = temp

 

    MsgBox ("Fini !")

   

End Sub