Si el comentario esta en varias lineas como en el ejemplo, esta funcion deberia servir, aunque algo excesiva en detalles, se puede reducir quitando opciones
.
Para quien quiera aprender os pongo unos comentarios con lo que va haciendo.
Código vb:
Ver originalFunction ExtraeComentarioL(ByVal sTexto As String, Optional ByVal sIniCom As String = "<!-- COMENTARIO -->", Optional ByVal sFinCom As String = "<!-- FIN COMENTARIO -->", Optional ByVal SensibleMayMin As Boolean = True) As String
Dim F As Long ' variable para los bucles for next
Dim MatrizU() As String ' creamos una matriz de tamaño variable
Dim MatrizR() As String ' creamos OTRA matriz de tamaño variable
MatrizR = Split(sTexto, vbCrLf) ' cargamos la matriz REAL con las lineas del texto NORMAL. cada linea se convierte en un elemento de la matriz.
If SensibleMayMin = False Then ' si no hay que distinguir entre mayusculas/minusculas...
sIniCom = UCase$(sIniCom) ' lo pasamos todo a...
sFinCom = UCase$(sFinCom) ' mayusculas para hacer las...
sTexto = UCase$(sTexto) ' comparaciones insensibles a may/min.
MatrizU = Split(sTexto, vbCrLf) ' cargamos la matriz UCASE con las lineas del texto EN MAYUSCULAS. cada linea se convierte en un elemento de la matriz.
Else ' si hay que ser sensible a may/min...
MatrizU = Split(sTexto, vbCrLf) ' cargamos la matriz UCASE con las lineas del texto NORMAL. cada linea se convierte en un elemento de la matriz.
End If
If InStr(1, sTexto, sIniCom) Or sIniCom = "" Then ' si existe el texto inicial dentro del texto completo o no hay texto inicial que buscar...
If sIniCom <> "" Then ' si el texto inicial no es una cadena en blanco...
For F = 0 To UBound(MatrizU) ' buscamos la linea con ese texto entre los elementos de la matriz.
If MatrizU(F) = sIniCom Then Exit For ' si encontramos la linea con el texto inicial salimos del bucle for next
Next F ' vamos comprobando todos los elementos
Else ' si el texto inicial es una cadena en blanco...
F = -1 ' vamos a capturar todas las líneas desde el comienzo hasta el texto final si existe, y si no existe, hasta el fin del texto completo
End If
If F < UBound(MatrizU) Then ' si hemos buscado el texto inicial y lo hemos encontrado en la matriz, F tendra un valor inferior al ubound de la matriz.
For F = F + 1 To UBound(MatrizU) ' de modo que capturamos elementos desde F+1 en adelante. recordaremos que F es el indice del elemento de la matriz que contiene el texto inicial, asi que capturamos desde el siguiente elemento en adelante.
If MatrizU(F) = sFinCom Then Exit For ' si llegamos al "fin de comentario" dejamos de capturar elementos y se acaba la funcion devolviendo el texto capturado.
If ExtraeComentarioL <> "" Then ExtraeComentarioL = ExtraeComentarioL & vbCrLf ' si no es la primera captura le añadimos un salto de linea para separar los elementos capturados
ExtraeComentarioL = ExtraeComentarioL & MatrizR(F) ' y añadimos el elemento (F) actual DE LA MATRIZ REAL a la cadena que devolveremos al salir de la funcion. Asi el texto devuelto es el original, y no el que se ha podido pasar antes a mayusculas.
Next F ' y asi hasta encontrar el fin de comentario o llegar al final del texto si sFinCom = "" o no se encuentra el texto final indicado.
End If
End If
End Function