Extraer cadena del texto (palabra) -- vba camp codereview Relacionados El problema

Extract String From Text (Word)


4
vote

problema

Español

Necesito encontrar una cadena específica de texto de una gran fuente de material. Acabo de usar Excel VBA hasta este punto, así que no conozco los objetos de la palabra y terminé solo grabando algunas macros y trabajando con lo que tenía. Sin embargo, de esta manera es muy ineficiente. Miré en un desbordamiento de la pila, pero no entendí lo que estaban haciendo, así que solo lo hice de esta manera.

Lo que estoy buscando en su mayoría es los objetos utilizados en Word VBA que son equivalentes a la 'Rango' de Excel ',' Celdas ',' Row ', y' columna '. Miré a MSDN, pero hay tanto material que debe tener una idea de lo que está buscando, y no pude encontrar ningún otro sitio que ayude.

Esto es lo que escribí, y hizo el trabajo, pero es muy ineficiente.

  Sub FindMediaInBraces()      ' Separate needed text     Selection.HomeKey Unit:=wdStory     With Selection.Find         .Text = "[Media"         .Replacement.Text = "^p^p[Media"         .Forward = True         .Wrap = wdFindContinue     End With     Selection.Find.Execute Replace:=wdReplaceAll      Selection.HomeKey Unit:=wdStory     With Selection.Find         .Text = ".jpg]"         .Replacement.Text = ".jpg]^p^p"         .Forward = True         .Wrap = wdFindContinue     End With     Selection.Find.Execute Replace:=wdReplaceAll      Selection.HomeKey Unit:=wdStory     With Selection.Find         .Text = ".png]"         .Replacement.Text = ".png]^p^p"         .Forward = True         .Wrap = wdFindContinue     End With     Selection.Find.Execute Replace:=wdReplaceAll      ' Remove text that doesn't start correctly     Dim i As Long      Selection.HomeKey Unit:=wdStory     For i = 1 To ActiveDocument.Paragraphs.count         Selection.MoveDown Unit:=wdParagraph, count:=1, Extend:=wdExtend         With Selection.Find             .Execute FindText:="[Media"             .Forward = True             If .Found = True Then                 Selection.MoveDown Unit:=wdParagraph, count:=1             Else                 Selection.Delete Unit:=wdCharacter, count:=1             End If         End With     Next  End Sub   

Texto de ejemplo

original

  Type: MC Objectives: 2.6 16) [HTML]If <i>y</i> varies directly with <i>x</i>, write an equation for the direct variation. Then find the value. If <i>y</i> = -4 when <i>x</i> = -28, what is the value of <i>x</i> when <i>y</i> = 5?[/HTML] *a. `$y=frac{1}{7}x;,, 35$` b. `$y=-frac{1}{7}x;,, -35$` c. `$y=7x;,, frac{5}{7}$` d. `$y=-7x;,, -frac{5}{7}$`  Type: MC Objectives: 3.3 21) Select the graph that correctly represents the following system of equations:    `$y=-frac{5}{3}x+3$`   `$y=frac{1}{3}x-3$` *a. [Media:Media/Images/Problem 21a.jpg] b. [Media:Media/Images/Problem 21b.jpg] c. [Media:Media/Images/Problem 21c.jpg] d. [Media:Media/Images/Problem 21d.jpg]   

después de macro

  [Media:Media/Images/Problem 21a.jpg] [Media:Media/Images/Problem 21b.jpg] [Media:Media/Images/Problem 21c.jpg] [Media:Media/Images/Problem 21d.jpg]   

Esto es lo que encontré en el desbordamiento de la pila, pero no conozco a los objetos que usar para aplicarlo, y no sé si realmente funcionaría en este caso.

  dim str as string dim openPos as integer dim closePos as integer dim midBit as string  str = "NUMBER(8,3)" openPos = instr (str, "(") closePos = instr (str, ")") midBit = mid (str, openPos+1, closePos - openPos - 1)   
Original en ingles

I need to find a specific string of text from a large source of material. I've just used Excel VBA up to this point, so I don't know the Word objects and I ended up just recording some macros and working with what I had. However, this way is very inefficient. I looked on Stack Overflow, but I didn't understand what they were doing, so I just did it this way.

What I am mostly looking for is the objects used in Word VBA that are equivalent to the Excel 'Range', 'Cells', 'Row', and 'Column'. I looked on MSDN, but there is so much material there that you need to have an idea of what you are looking for, and I couldn't find any other sites that would help.

This is what I wrote, and it did the job, but it is very inefficient.

Sub FindMediaInBraces()      ' Separate needed text     Selection.HomeKey Unit:=wdStory     With Selection.Find         .Text = "[Media"         .Replacement.Text = "^p^p[Media"         .Forward = True         .Wrap = wdFindContinue     End With     Selection.Find.Execute Replace:=wdReplaceAll      Selection.HomeKey Unit:=wdStory     With Selection.Find         .Text = ".jpg]"         .Replacement.Text = ".jpg]^p^p"         .Forward = True         .Wrap = wdFindContinue     End With     Selection.Find.Execute Replace:=wdReplaceAll      Selection.HomeKey Unit:=wdStory     With Selection.Find         .Text = ".png]"         .Replacement.Text = ".png]^p^p"         .Forward = True         .Wrap = wdFindContinue     End With     Selection.Find.Execute Replace:=wdReplaceAll      ' Remove text that doesn't start correctly     Dim i As Long      Selection.HomeKey Unit:=wdStory     For i = 1 To ActiveDocument.Paragraphs.count         Selection.MoveDown Unit:=wdParagraph, count:=1, Extend:=wdExtend         With Selection.Find             .Execute FindText:="[Media"             .Forward = True             If .Found = True Then                 Selection.MoveDown Unit:=wdParagraph, count:=1             Else                 Selection.Delete Unit:=wdCharacter, count:=1             End If         End With     Next  End Sub 

Example Text

Original

Type: MC Objectives: 2.6 16) [HTML]If <i>y</i> varies directly with <i>x</i>, write an equation for the direct variation. Then find the value. If <i>y</i> = -4 when <i>x</i> = -28, what is the value of <i>x</i> when <i>y</i> = 5?[/HTML] *a. `$y=\frac{1}{7}x;\,\, 35$` b. `$y=-\frac{1}{7}x;\,\, -35$` c. `$y=7x;\,\, \frac{5}{7}$` d. `$y=-7x;\,\, -\frac{5}{7}$`  Type: MC Objectives: 3.3 21) Select the graph that correctly represents the following system of equations:    `$y=-\frac{5}{3}x+3$`   `$y=\frac{1}{3}x-3$` *a. [Media:Media/Images/Problem 21a.jpg] b. [Media:Media/Images/Problem 21b.jpg] c. [Media:Media/Images/Problem 21c.jpg] d. [Media:Media/Images/Problem 21d.jpg] 

After Macro

[Media:Media/Images/Problem 21a.jpg] [Media:Media/Images/Problem 21b.jpg] [Media:Media/Images/Problem 21c.jpg] [Media:Media/Images/Problem 21d.jpg] 

This is what I found on Stack Overflow, but I don't know the objects to use to apply it, and I don't know if it would actually work in this case.

dim str as string dim openPos as integer dim closePos as integer dim midBit as string  str = "NUMBER(8,3)" openPos = instr (str, "(") closePos = instr (str, ")") midBit = mid (str, openPos+1, closePos - openPos - 1) 
  

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Una buena manera de hacerlo sería por .Sentences , suponiendo que su cadena no aparezca más de una vez por oración. Puede usar instr para obtener la ubicación de sus cadenas y luego almacenarlos en una matriz. Luego imprima donde quieras:

  Sub GetMediaStrings()     Const BEGIN_STRING As String = "[Media:"     Const END_STRING As String = ".jpg"     Dim searchRange As Range     Dim startString As Long     Dim endString As Long     Dim results() As String     ReDim results(1 To 2)     For Each searchRange In ActiveDocument.Sentences         startString = InStr(1, searchRange, BEGIN_STRING, vbTextCompare)         If startString > 0 Then             endString = InStr(1, searchRange, END_STRING, vbTextCompare)             If endString > 0 Then                 results(UBound(results) - 1) = Mid(searchRange, startString, endString - startString + Len(END_STRING))                 ReDim Preserve results(1 To UBound(results) + 1)             End If         End If     Next End Sub   

Es posible que también quiera hacerlo a través de .StoryRanges < / Código> .

 

A good way to do this would be by .Sentences, assuming your string doesn't appear more than once per sentence. You can use instr to get the location of your strings and then store them in an array. Then print them wherever you want:

Sub GetMediaStrings()     Const BEGIN_STRING As String = "[Media:"     Const END_STRING As String = ".jpg"     Dim searchRange As Range     Dim startString As Long     Dim endString As Long     Dim results() As String     ReDim results(1 To 2)     For Each searchRange In ActiveDocument.Sentences         startString = InStr(1, searchRange, BEGIN_STRING, vbTextCompare)         If startString > 0 Then             endString = InStr(1, searchRange, END_STRING, vbTextCompare)             If endString > 0 Then                 results(UBound(results) - 1) = Mid(searchRange, startString, endString - startString + Len(END_STRING))                 ReDim Preserve results(1 To UBound(results) + 1)             End If         End If     Next End Sub 

You might also want to do it via .StoryRanges.

 
 

Relacionados problema

2  Importando datos en Excel  ( Importing data into excel ) 
¿Existe una forma más fácil de importar datos en una matriz de Excel u otra estructura de datos? He intentado investigar colecciones, pero he encontrado la D...

48  Lista <T> Implementación para VB6 / VBA  ( Listt implementation for vb6 vba ) 
Recientemente, decidí que el 998877665555544330 no fue suficiente para mis necesidades, así que decidí implementar algo como C # 's List<T> . Aquí está la ...

7  Recuperando datos de archivos en la carpeta  ( Retrieving data from files in the folder ) 
Estoy a usar el código VBA para simplemente recuperar ciertos datos de todos los archivos de Excel en cierta carpeta y pegarlo en la hoja de cálculo de trabaj...

5  Copiando datos de libros cerrados  ( Copying data from closed workbooks ) 
Soy un pasante en una empresa industrial en Brasil y sucede que estoy usando mucho en Excel. Acabo de empezar a jugar con VBA hace un par de días, ¡y me divie...

10  Imitación básica de C # enumerable en VBA - o cualquier otra clase estática  ( Basic imitation of c enumerable in vba or any other static class ) 
Desde la implementación de clases estáticas en VBA en realidad parece posible Se me ocurrió una idea para tratar de imitar C # ' 9988776655544330 clase ...

3  Comparando células de dos hojas de trabajo  ( Comparing cells of two worksheets ) 
Con el siguiente código, trato de comparar el contenido de dos hojas de trabajo. La primera columna contiene una clave que es única y las siguientes columnas ...

6  Fijación de archivos de reclamación médica a través del archivo de texto Lea / escribe  ( Fixing medical claim files through text file read write ) 
Con Gracias a @ Mat'Smug y @comintern por su aliento, aquí hay un programa que escribí para ayudar a mi equipo a reparar archivos de reclamación médica. El ...

6  Juego de serpientes - Dentro de la hoja de trabajo - Celdas como píxeles  ( Snake game within worksheet cells as pixels ) 
Desde mi intento bastante mediocre de hacer un juego de invasores del espacio, me topé con un caché de juegos de Visual Basic para solicitar juegos escritos p...

6  Crear tabla que enumera la visibilidad de la hoja de trabajo  ( Create table that lists worksheet visibility ) 
Siguiendo mi pregunta anterior crear Una tabla que enumera las macros en un libro de trabajo o hoja de trabajo Aquí está mi Sub para determinar la visibilid...

2  Búsqueda de pruebas de abstracción y unidad en mesa Excel  ( Abstracting and unit testing lookups in excel table ) 
Fondo Tengo una solución de VBA que utilizo para ingerir informes de texto de inversión y reformatearlos para su análisis en Excel. Funciona, pero las macro...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos