Visual Basic para Aplicaciones - buscar y ejecutar una macro

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 26
Ha aumentado su posición en 3 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

buscar y ejecutar una macro

Publicado por Happy1 (13 intervenciones) el 13/02/2020 18:17:10
Hola.
Necesito en un texto de Word que me busque todos los "1*" y me los reemplace por una macro que ya tengo creada. Me podrían ayudar?

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 26
Ha aumentado su posición en 3 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

buscar y ejecutar una macro

Publicado por Happy1 (13 intervenciones) el 14/02/2020 17:50:04
El ejemplo sería el siguien. Tengo un documento de texto en word y hay varios "1*" y lo que intento es crear una macro que busque todos los "1*" de todo el documento y los sustituya por una macro que ya tengo creada. La macro sería así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Alonso()
'
' Alonso Macro
' Macro grabada el 26/06/03 por Alberto Bastián Ordiales
'
    Selection.TypeText Text:=vbTab
    Selection.Font.Bold = wdToggle
    Selection.Font.Size = 9
    Selection.TypeText Text:="LA SEÑORA ROMERO ALONSO "
    Selection.Font.Size = 10
    Selection.TypeText Text:="(consejera de Participación, Cooperación y Derechos Humanos):"
    Selection.Font.Bold = wdToggle
    Selection.TypeText Text:=" "
End Sub

No sé si me he explicado bien, si no se entiende me decís he intento explicarlo de otra forma.

Un saludo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

buscar y ejecutar una macro

Publicado por Antoni Masana (498 intervenciones) el 14/02/2020 20:41:53
A ver si lo entiendo:

Según tu texto quieres buscar un los textos "1*" y reemplazarlo por una macro ¿Que pinta una macro en medio de un documento?

Segun lo explicas yo lo veo asi:

Texto Original:
1
Antonio vive en 1*

Texto resultante:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Antonio vive en Sub Alonso()
    '
    ' Alonso Macro
    ' Macro grabada el 26/06/03 por Alberto Bastián Ordiales
    '
    Selection.TypeText Text:=vbTab
    Selection.Font.Bold = wdToggle
    Selection.Font.Size = 9
    Selection.TypeText Text:="LA SEÑORA ROMERO ALONSO "
    Selection.Font.Size = 10
    Selection.TypeText Text:="(consejera de Participación, Cooperación y Derechos Humanos):"
    Selection.Font.Bold = wdToggle
    Selection.TypeText Text:=" "
End Sub

NO TIENE NINGÚN SENTIDO.

Deduzco que lo que quieres es que la macro busque el texto "1*" y lo reemplace por el texto y las características de la macro que muestras.

Vamos que no sabes como buscar y reemplazar.

Hay un pequeño truco y es usar la GRABADORA DE MACROS, te pone el 95% del código y el resto es relativamente facil.

Quizas esto te pueda servir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Sub Macro3()
    CommandBars("Navigation").Visible = False
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "1*"
        .Replacement.Text = "1*"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
 
    On Error GoTo Fin
 
    While True
        With Selection
            If .Find.Forward = True Then
                .Collapse Direction:=wdCollapseStart
            Else
                .Collapse Direction:=wdCollapseEnd
            End If
            .Find.Execute Replace:=wdReplaceOne
            If .Find.Forward = True Then
                .Collapse Direction:=wdCollapseEnd
            Else
                .Collapse Direction:=wdCollapseStart
            End If
            .Find.Execute
        End With
        Call Alonso
    Wend
Fin:
End Sub
 
Sub Alonso()
    '
    ' Alonso Macro
    ' Macro grabada el 26/06/03 por Alberto Bastián Ordiales
    '
    Selection.TypeText Text:=vbTab
    Selection.Font.Bold = wdToggle
    Selection.Font.Size = 9
    Selection.TypeText Text:="LA SEÑORA ROMERO ALONSO "
    Selection.Font.Size = 10
    Selection.TypeText Text:="(consejera de Participación, Cooperación y Derechos Humanos):"
    Selection.Font.Bold = wdToggle
    Selection.TypeText Text:=" "
End Sub


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 3 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

buscar y ejecutar una macro

Publicado por Happy1 (13 intervenciones) el 15/02/2020 01:43:07
En primer lugar muchas gracias por tu respuesta.

Que no lo entiendas no quiere decir que no tiene sentido. Efectivamente, lo que intento es crear una macro que busque todos los 5* y los reemplace por una macro.

jejeje, bueno, lo de buscar y reemplazar. La verdad es que si te hubieses fijado un poquito en la macro te darías cuenta que hay dos tipos de tamaño de letra (Arial 9 y Arial 10). Me gustaría que me indicaras cómo buscar 5* y lo reemplazas por un texto que tiene dos tamaños de letra. La verdad es que siento mucha curiosidad. No te lo tomes a mal, pero me ha dado la impresión que te había molestado mi ignorancia en el tema.

Lo de utilizar la grabadora de macro, hasta ahí ya llego y un luego te mostraré cómo he llegado a conseguirlo, aunque supongo que no es la forma correcta.

La macro que me indicas creo que se trata de una bucle sin fin, te acaba bloqueando el word. Yo la he probado y es lo que hace.

Yo lo que he conseguido hacer fue esto:

Sub ABtitulo5()
'
' ABtitulos5 Macro
'
'
Selection.Find.ClearFormatting
With Selection.Find
.Text = "5*"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Application.Run MacroName:="Gonzalez"
End Sub

Sub Gonzalez()
'
' Gonzalez Macro
' Macro grabada el 26/06/03 por Alberto Bastián Ordiales
'
Selection.TypeText Text:=vbTab
Selection.Font.Bold = wdToggle
Selection.Font.Size = 9
Selection.TypeText Text:="EL SEÑOR GONZÁLEZ GONZÁLEZ "
Selection.Font.Size = 10
Selection.TypeText Text:="(consejero de Hacienda):"
Selection.Font.Bold = wdToggle
Selection.TypeText Text:=" "
End Sub

Sub ABucle5()

Dim i As Integer
Dim intVeces As Integer

intVeces = InputBox("Ingresa el número de veces a repetir:", "Mi Sistema", 10)

For i = 1 To intVeces

ABtitulo5

Next i

End Sub

Es decir, tengo una primera macro (ABtitulo5) donde hago una búsqueda de 1*, cierro la búsqueda y ejecuto una macro (Gonzalez) y al final creo otra macro en en bucle variable (ABucle5) que al ejecutar me pregunta las veces que quiero ejecutar la macro. El inconveniente es que primero tengo que hacer una búsqueda en el documento para saber las veces que se repite 5*.

Lo que intentaba averiguar es si había alguna otra forma mucho más rápida y directa.

De todas formas te agradezco mucho tu ayuda porque siempre se aprende de la gente y yo siempre estoy dispuesto a hacerlo. Yo estoy abierto a cualquier otra solución que me puedas proporcionar.

Tal vez no tenga sentido para tí todo esto, se trata de una grabación de un debate entre varia personas con intervenciones largas y cortas la cual transcribo con google docs, el problema es que transcribe sin puntuar, todo seguido, y lo que intento es insertar los oradores intervinientes para luego darle sentido a las frases. En definitiva, una transcripción .

Un saludo y de nuevo muchísimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 3 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

buscar y ejecutar una macro

Publicado por Happy1 (13 intervenciones) el 26/02/2020 20:37:28
He encontrado en la web (https://wordribbon.tips.net/) dos soluciones que más o menos se ajustan a lo que pedía y las voy a poner aquí por si le sirven a alguien.

La primera es una macro que al ejecutarla te irá saliendo una ventana para que indiques la palabra que buscas y una vez le das a Aceptar te muestra las veces que se repite esa palabra, al volver a dar Aceptar te vuelve a salir la ventana para buscar otra palabra. Cuando ya no se quiere buscar más se le da a cancelar. La pena es que no te crea un documento nuevo con la lista de palabras buscadas y las veces que se repitan, eso ya sería la repera.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub FindWords()
    Dim sResponse As String
    Dim iCount As Integer
 
    ' Input different words until the user clicks cancel
    Do
        ' Identify the word to count
        sResponse = InputBox( _
          Prompt:="¿Qué palabra quieres contar?", _
          Title:="Contar palabras", Default:="")
 
        If sResponse > "" Then
            ' Set the counter to zero for each loop
            iCount = 0
            Application.ScreenUpdating = False
            With Selection
                .HomeKey Unit:=wdStory
                With .Find
                    .ClearFormatting
                    .Text = sResponse
                    ' Loop until Word can no longer
                    ' find the search string and
                    ' count each instance
                    Do While .Execute
                        iCount = iCount + 1
                        Selection.MoveRight
                    Loop
                End With
                ' show the number of occurences
                MsgBox sResponse & " appears " & iCount & " times"
            End With
            Application.ScreenUpdating = True
        End If
    Loop While sResponse <> ""
End Sub


Y la segunda lo que hace es buscar todas las palabras de un documento e indicar cuántas veces se repite, esta lista se añade a un documento nuevo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Sub AAAWordFrequency()
    Const maxwords = 9000          'Maximum unique words allowed
    Dim SingleWord As String       'Raw word pulled from doc
    Dim Words(maxwords) As String  'Array to hold unique words
    Dim Freq(maxwords) As Integer  'Frequency counter for unique words
    Dim WordNum As Integer         'Number of unique words
    Dim ByFreq As Boolean          'Flag for sorting order
    Dim ttlwds As Long             'Total words in the document
    Dim Excludes As String         'Words to be excluded
    Dim Found As Boolean           'Temporary flag
    Dim j, k, l, Temp As Integer   'Temporary variables
    Dim ans As String              'How user wants to sort results
    Dim tword As String            '
    Dim aword As Object            '
    Dim tmpName As String          '
 
    ' Set up excluded words
    Excludes = "[the][a][of][is][to][for][by][be][and][are]"
 
    ' Find out how to sort
    ByFreq = True
    ans = InputBox("Sort by WORD or by FREQ?", "Sort order", "WORD")
    If ans = "" Then End
    If UCase(ans) = "WORD" Then
        ByFreq = False
    End If
 
    Selection.HomeKey Unit:=wdStory
    System.Cursor = wdCursorWait
    WordNum = 0
    ttlwds = ActiveDocument.Words.Count
 
    ' Control the repeat
    For Each aword In ActiveDocument.Words
        SingleWord = Trim(LCase(aword))
        'Out of range?
        If SingleWord < "a" Or SingleWord > "z" Then
            SingleWord = ""
        End If
        'On exclude list?
        If InStr(Excludes, "[" & SingleWord & "]") Then
            SingleWord = ""
        End If
        If Len(SingleWord) > 0 Then
            Found = False
            For j = 1 To WordNum
                If Words(j) = SingleWord Then
                    Freq(j) = Freq(j) + 1
                    Found = True
                    Exit For
                End If
            Next j
            If Not Found Then
                WordNum = WordNum + 1
                Words(WordNum) = SingleWord
                Freq(WordNum) = 1
            End If
            If WordNum > maxwords - 1 Then
                j = MsgBox("Too many words.", vbOKOnly)
                Exit For
            End If
        End If
        ttlwds = ttlwds - 1
        StatusBar = "Remaining: " & ttlwds & ", Unique: " & WordNum
    Next aword
 
    ' Now sort it into word order
    For j = 1 To WordNum - 1
        k = j
        For l = j + 1 To WordNum
            If (Not ByFreq And Words(l) < Words(k)) _
              Or (ByFreq And Freq(l) > Freq(k)) Then k = l
        Next l
        If k <> j Then
            tword = Words(j)
            Words(j) = Words(k)
            Words(k) = tword
            Temp = Freq(j)
            Freq(j) = Freq(k)
            Freq(k) = Temp
        End If
        StatusBar = "Sorting: " & WordNum - j
    Next j
 
    ' Now write out the results
    tmpName = ActiveDocument.AttachedTemplate.FullName
    Documents.Add Template:=tmpName, NewTemplate:=False
    Selection.ParagraphFormat.TabStops.ClearAll
    With Selection
        For j = 1 To WordNum
            .TypeText Text:=Trim(Str(Freq(j))) _
              & vbTab & Words(j) & vbCrLf
        Next j
    End With
    System.Cursor = wdCursorNormal
    j = MsgBox("There were " & Trim(Str(WordNum)) & _
      " different words ", vbOKOnly, "Finished")
 
End Sub

Espero que a alguien le pueda servir. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar