ATENCION: SRC CORREGIDOHola, aqui os dejo esta funcin que acabo de hacer, no es gran cosa, pero bueno... :P
' ////////////////////////////////////////////////////////////////
' // *Autor: *PsYkE1* (miguelin.majo@gmail.com) //
' // *Podeis agrandar o reducir el codigo, siempre y cuando se //
' // respete la autoria y se me comuniquen esos cambios. //
' // *Agradecimientos a BlackZeroX & Cobein //
' // *Visita http://foro.rthacker.net //
' ////////////////////////////////////////////////////////////////
Option Explicit
Public Function Text_Between_Words(ByVal sTextToAnalyze As String, ByVal sStartWord As String, ByVal sEndWord As String) As String
Dim iPosition1 As Integer
Dim iPosition2 As Integer
Dim iStart As Integer
iPosition1 = InStr(sTextToAnalyze, sStartWord)
If iPosition1 <> 0 Then
iStart = iPosition1 + Len(sStartWord)
iPosition2 = InStr(iStart, sTextToAnalyze, sEndWord)
Else
Exit Function
End If
If iPosition2 <> 0 Then
Text_Between_Words = Mid$(sTextToAnalyze, iStart, iPosition2 - iStart)
End If
End Function
Un ejemplo seria asi:
El contexto es el ámbito de referencia de un texto. ¿Qué entiendo por ámbito de referencia?.
Debug.Print Text_Between_Words(Text1.Text, "referencia", "entiendo")
El resultado seria:
Citar
de un texto. ¿Qué
Y si pongo esto:
Debug.Print Text_Between_Words(Text1.Text, "referencia", "referencia")
Me sale esto:
Citar
de un texto. ¿Qué entiendo por ámbito de
Espero que os haya gustado(mas aun :xD)... ;)
Salu2!
Muy bueno *PsYkE1*, me gustó...! ;D
me costo entender como andaba asi que voy a explicarlo otra vez. :xD
Si en la caja de texto escribo
No entendi el codigo y por eso hago esto
y llamo a la funcion como
MsgBox Text_Between_Words(Text1.Text, "Codigo", "Esto")
me responde:
y por eso hago
Esta bueno pero si lo hiciste vos porque esta en ingles el mensaje de error :S...
Ademas. Para que sirve??
Muy bueno para aprender como usar el instr que no sabia que existia y para practicar pero no entendi del todo para que sirve ;D ;D
Toda la onda :D
:-\ Me intrigo eso de que el mensaje esta en ingles...!
*PsYkE1*, no lo tomes a mal, pero detesto a los Copy&Paste...! Espero que esa funcion sea 100% tuya... Sino, tomate este momento para colocar su autor...! :¬¬
Cita de: Elemental Code en 31 Mayo 2010, 22:19 PM
me costo entender como andaba asi que voy a explicarlo otra vez. :xD
Si en la caja de texto escribo
No entendi el codigo y por eso hago esto
y llamo a la funcion como
MsgBox Text_Between_Words(Text1.Text, "Codigo", "Esto")
me responde:
y por eso hago
Esta bueno pero si lo hiciste vos porque esta en ingles el mensaje de error :S...
Ademas. Para que sirve??
Muy bueno para aprender como usar el instr que no sabia que existia y para practicar pero no entendi del todo para que sirve ;D ;D
Toda la onda :D
Por cierto asi es como funciona Elemental, te muestra el texto que contiene una frase entre 2 palabras...!
Cita de: ssccaann43 en 31 Mayo 2010, 22:15 PM
Muy bueno *PsYkE1*, me gustó...! ;D
:o
Gracias
ssccaann43! ;)
Cita de: Elemental Code en 31 Mayo 2010, 22:19 PM
me costo entender como andaba asi que voy a explicarlo otra vez. :xD
Si en la caja de texto escribo
No entendi el codigo y por eso hago esto
y llamo a la funcion como
MsgBox Text_Between_Words(Text1.Text, "Codigo", "Esto")
me responde:
y por eso hago
Si, exacto, pero no te olvides de si la palabra lleva minusculas o MAYUSCULAS...
MsgBox Text_Between_Words(Text1.Text, "codigo", "esto")
Cita de: Elemental Code en 31 Mayo 2010, 22:19 PM
Esta bueno pero si lo hiciste vos porque esta en ingles el mensaje de error :S...
Jajaja :laugh:
Pense que quedaria más internacional... :laugh:
Cita de: Elemental Code en 31 Mayo 2010, 22:19 PM
Ademas. Para que sirve??
He posteado porque lo necesitaba para un proyecto que estoy haciendo, y pense que podia ser interesante... :silbar:
Salu2! ;)
Cita de: ssccaann43 en 31 Mayo 2010, 22:21 PM
:-\ Me intrigo eso de que el mensaje esta en ingles...!
*PsYkE1*, no lo tomes a mal, pero detesto a los Copy&Paste...! Espero que esa funcion sea 100% tuya... Sino, tomate este momento para colocar su autor...! :¬¬
Te puedo asegurar que no es C&P ssccaann43... :)
El mensaje lo puse en ingles con el Google traductor... :silbar:
Me desagrada que pienses eso... :-(
Prefiero subir una m**** de code (como ya he hecho en ocasiones) a hacer un C&P...
Salu2!
Bueno, te pedi que no te molestaras ni lo tomes a mal...!
Excelente entonces...! ;D Un saludo...!
.
Dejen de decir C&P y opinen ("Eso diria si fuese el autor del hilo...")
Dim pos1 as integer
Es pos1 o pos?
para que no te sucedan estas cosas feas usa al inicio
option explicit
* Lo peor que puedes hacer en una funcion es meterle un msgbox inputbox o X cosa SON ESTORBOS CREEME NO SON DINAMICOS.
Por otra parte...
Aqui esta mi funcion Entre Texto es "Anti-Error".
'
' ////////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) //
' // //
' // Web: http://InfrAngeluX.Sytes.Net/ //
' // //
' // |-> Pueden Distribuir Este Codigo siempre y cuando //
' // no se eliminen los creditos originales de este codigo //
' // No importando que sea modificado/editado o engrandesido //
' // o achicado, si es en base a este codigo //
' ////////////////////////////////////////////////////////////////
Option Explicit
Public Function Entre_Texto(ByRef StrIn As String, ByVal StrIni As String, ByVal StrFin As String, Optional ComparacionEstricta As Boolean) As String
Dim Pos(1) As Long
Dim IniPos As Long
Dim OptionalCompare As VbCompareMethod
If Len(StrIn) > 0 Then
If ComparacionEstricta Then
OptionalCompare = vbBinaryCompare
Else
OptionalCompare = vbTextCompare
End If
Pos(0) = InStr(1, StrIn, StrIni, OptionalCompare)
Pos(1) = InStr(1, StrIn, StrFin, OptionalCompare)
If CBool(Pos(0)) And CBool(Pos(1)) And Pos(0) < Pos(1) Then
IniPos = Pos(0) + Len(StrIni)
Entre_Texto = Mid$(StrIn, IniPos, Pos(1) - IniPos)
End If
End If
End Function
Aqui dejo tres funciones que hacen esactamente lo mismo (Ojo esta igual viene incluida pero corregida por un servidor, incluyo la que yo cree y use desde hace mucho).
Option Explicit
Private Function TextoEntreMedio(Texto As String, Palabra1 As String, Palabra2 As String)
TextoEntreMedio = Left$(Mid$(Texto, InStr(Texto, Palabra1) + Len(Palabra1)), InStr(Mid$(Texto, InStr(Texto, Palabra1) + Len(Palabra1)), Palabra2) - 1)
End Function
Public Function Text_Between_Words(Text As String, String1 As String, String2 As String) As String
Dim Pos1 As Integer
Dim Pos2 As Integer
Dim Start As Integer
Dim TotalLen As Integer
Pos1 = InStr(Text, String1)
Pos2 = InStr(Text, String2)
If Pos1 = 0 Or Pos2 = 0 Then GoTo NoExists
Start = Pos1 + Len(String1)
TotalLen = Pos2 - Start
Text_Between_Words = Mid(Text, Start, TotalLen)
Exit Function
NoExists:
MsgBox "Error, check that the two words are in the text, if so," & vbCrLf _
& " make sure you are entered correctly.", vbCritical
End Function
'
' ////////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) //
' // //
' // Web: http://InfrAngeluX.Sytes.Net/ //
' // //
' // |-> Pueden Distribuir Este Codigo siempre y cuando //
' // no se eliminen los creditos originales de este codigo //
' // No importando que sea modificado/editado o engrandesido //
' // o achicado, si es en base a este codigo //
' ////////////////////////////////////////////////////////////////
Public Function Entre_Texto(ByRef StrIn As String, ByVal StrIni As String, ByVal StrFin As String, Optional ComparacionEstricta As Boolean) As String
Dim Pos(1) As Long
Dim IniPos As Long
Dim OptionalCompare As VbCompareMethod
If Len(StrIn) > 0 Then
If ComparacionEstricta Then
OptionalCompare = vbBinaryCompare
Else
OptionalCompare = vbTextCompare
End If
Pos(0) = InStr(1, StrIn, StrIni, OptionalCompare)
Pos(1) = InStr(1, StrIn, StrFin, OptionalCompare)
If CBool(Pos(0)) And CBool(Pos(1)) And Pos(0) < Pos(1) Then
IniPos = Pos(0) + Len(StrIni)
Entre_Texto = Mid$(StrIn, IniPos, Pos(1) - IniPos)
End If
End If
End Function
Private Sub Form_Load()
Const StrOri As String = "Miguel Angel Ortega Avila"
Const StrIni As String = "an"
Const StrFin As String = "vila"
MsgBox Text_Between_Words(StrOri, StrIni, StrFin)
MsgBox TextoEntreMedio(StrOri, StrIni, StrFin)
MsgBox Entre_Texto(StrOri, StrIni, StrFin, True)
MsgBox Entre_Texto(StrOri, StrIni, StrFin, False)
End Sub
Dulce Infierno Lunar!¡.
se me olvido el formato REAL de InStr() es
Function InStr([Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare])
Miembro de VBA.Strings
Devuelve la posición de la primera instancia de una cadena dentro de otra
Function InStrB([Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare])
Miembro de VBA.Strings
Devuelve la posición del byte de la primera instancia de una cadena dentro de otra
Function InStrRev(StringCheck As String, StringMatch As String, [Start As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) As Long
Miembro de VBA.Strings
Returns the position of the last occurrence of one string within another
Para quien no sepa que funciones existen en vb6 abran el IDE creen o abaran un nuevo proyecto y opriman la fecla [/b]F2
Tamabien se pueden acceder desde el Intelicense escribiendo
VBA.
como si fuese
Me.
Text1.
ETC...
Dulce Infierno Lunar!¡.
Gracias Black! ;-)
Corregire esos detalles... :P
:o
Se puede hacer en una linea!
En cuanto a lo del Msgbox lo hice para que fuera mas grafico, para no meter el resultado de la funcion en una variable... :silbar:
Como me recomiendas ponerlo?¿ :huh:
Salu2! :)
si se puede en una linea lo malo es que se usan variadas veces Len() o Instr() o X cosa yo pefiero hacerlo una sola vez aun que sean mas lineas.
Private Function TextoEntreMedio(Texto As String, Palabra1 As String, Palabra2 As String)
TextoEntreMedio = Left$(Mid$(Texto, InStr(Texto, Palabra1) + Len(Palabra1)), InStr(Mid$(Texto, InStr(Texto, Palabra1) + Len(Palabra1)), Palabra2) - 1)
End Function
y lo del msgbox como dije no metas nada dentro de una funcion a mi personalmente no me convence por que no es DINAMICO.
A se me paso lo del Mid() cuando uses un string usa Mid$() en lugar de Mid() es cuando tomas X texto y lo almacenas en una variable tipo strinmg o similar!¡.
Dulce Infierno Lunar!¡.
mmmmmmmm
OK
Porque no es aconsejable utilizar muchas veces Len() o Instr()?? :huh:
Lo de Mid$() lo sabia, pero se me olvido... :P (ya esta corregido)
Gracias!
por si no te fijaste, la que posteo BlackZeroX▓▓▒▒░░ , ya te la habia puesto en este post:
[Ayuda] Leer texto web (http://foro.elhacker.net/programacion_visual_basic/ayuda_leer_texto_web-t295026.0.html)
Cita de: *PsYkE1* en 1 Junio 2010, 00:54 AM
mmmmmmmm
OK
Porque no es aconsejable utilizar muchas veces Len() o Instr()?? :huh:
Lo de Mid$() lo sabia, pero se me olvido... :P (ya esta corregido)
Gracias!
1er Caso:Donde 12 +5 se repite una sola vez y se usa su resultado:
Variable1 = 12 + 5
Variable2 = Variable1 + 7 + 2 + Variable1
2do Caso:Donde (12+5) se repite 3 veces.
Variable1 = (12 + 5) + (12 + 5) + 7 + 2 + (12 + 5)
Ahora imagina que ese (12 + 5) te conlleva 15 segundos:
1er Caso:
Calculo de (12+5 = 15 seg ) + Segundos extras
2do Caso:
Como se repite (12+5) tres veces:
(12+5) = 15 segundos por 3 = 45 segundos + segundos extras
Conclusion: Si puedes almacenar el resultado de una funcion o x dato en una variable será mas optimo por que no se repite el proceso inesesariamente!¡.
En otras Palabras las cosas minimalistas
NO SIEMPRE son las mas optimas y adaptables!¡.
P.D.: Como dice
Seba123Neo esa funcionla sa que de el post que cito.}
Dulce Infierno Lunar!¡.
Cita de: seba123neo en 1 Junio 2010, 03:28 AM
por si no te fijaste, la que posteo BlackZeroX▓▓▒▒░░ , ya te la habia puesto en este post:
[Ayuda] Leer texto web (http://foro.elhacker.net/programacion_visual_basic/ayuda_leer_texto_web-t295026.0.html)
AJAJAJA :laugh:
No me habia fijado...
Gracias por la explicacion BlackZeroX▓▓▒▒░░! ;)
Salu2!
Todas las funciones esas tiene un problema de logica.....
Si, por ejemplo, hago una busqueda asi
Const StrOri As String = "Miguel Angel Ortega Avila"
Const StrIni As String = "El"
Const StrFin As String = "el"
el resultado va a ser nulo porque se comienza a buscar desde el principio en ambas ocasiones y en realidad la segunda palabra se tiene que buscar a partir del final de la primera.....
Public Function Entre_Texto(ByRef StrIn As String, ByVal StrIni As String, ByVal StrFin As String, Optional ComparacionEstricta As Boolean) As String
Dim Pos(1) As Long
Dim IniPos As Long
If Len(StrIn) Then
Pos(0) = InStr(1, StrIn, StrIni, Abs(Not ComparacionEstricta))
If Pos(0) = 0 Then Exit Function
IniPos = Pos(0) + Len(StrIni)
Pos(1) = InStr(IniPos, StrIn, StrFin, Abs(Not ComparacionEstricta))
If Pos(1) = 0 Then Exit Function
Entre_Texto = Mid$(StrIn, IniPos, Pos(1) - IniPos)
End If
End Function
Private Sub Form_Load()
Const StrOri As String = "Miguel Angel Ortega Avila"
Const StrIni As String = "El"
Const StrFin As String = "el"
'MsgBox Text_Between_Words(StrOri, StrIni, StrFin)
'MsgBox TextoEntreMedio(StrOri, StrIni, StrFin)
Debug.Print Entre_Texto(StrOri, StrIni, StrFin, True)
Debug.Print Entre_Texto(StrOri, StrIni, StrFin, False)
End Sub
@Cobein
Public Function Entre_Texto(ByRef StrIn As String, ByVal StrIni As String, ByVal StrFin As String, Optional ComparacionEstricta As Boolean) As String
Dim Pos(1) As Long
Dim IniPos As Long
Dim OptionalCompare As VbCompareMethod
If Len(StrIn) > 0 Then
If ComparacionEstricta Then
OptionalCompare = vbBinaryCompare
Else
OptionalCompare = vbTextCompare
End If
Pos(0) = InStr(1, StrIn, StrIni, OptionalCompare)
Pos(1) = InStr(1, StrIn, StrFin, OptionalCompare)
If CBool(Pos(0)) And CBool(Pos(1)) And Pos(0) < Pos(1) Then
IniPos = Pos(0) + Len(StrIni)
Entre_Texto = Mid$(StrIn, IniPos, Pos(1) - IniPos)
End If
End If
End Function
Public Function Entre_Texto_EditCobein(ByRef StrIn As String, ByVal StrIni As String, ByVal StrFin As String, Optional ComparacionEstricta As Boolean) As String
Dim Pos(1) As Long
Dim IniPos As Long
If Len(StrIn) Then
Pos(0) = InStr(1, StrIn, StrIni, Abs(Not ComparacionEstricta))
If Pos(0) = 0 Then Exit Function
IniPos = Pos(0) + Len(StrIni)
Pos(1) = InStr(IniPos, StrIn, StrFin, Abs(Not ComparacionEstricta))
If Pos(1) = 0 Then Exit Function
Entre_Texto_EditCobein = Mid$(StrIn, IniPos, Pos(1) - IniPos)
End If
End Function
Private Sub Form_Load()
Const StrOri As String = "Miguel Angel Ortega Avila"
Const StrIni As String = "El"
Const StrFin As String = "el"
Debug.Print "BlackZeroX"
Debug.Print "with true """; Entre_Texto(StrOri, StrIni, StrFin, True); """"
Debug.Print "with false """; Entre_Texto(StrOri, StrIni, StrFin, False); """"
Debug.Print "Cobein"
Debug.Print "with true """; Entre_Texto_EditCobein(StrOri, StrIni, StrFin, True); """"
Debug.Print "with false """; Entre_Texto_EditCobein(StrOri, StrIni, StrFin, False); """"
End Sub
Creo que no viste esta linea!¡.
If CBool(Pos(0)) And CBool(Pos(1)) And Pos(0) < Pos(1) Then
Aunque Cbool() se vea un poco demas solo es para compresion igual se quita.
Dulñce Infierno Lunar!¡.
IniPos = Pos(0) + Len(StrIni)
Pos(1) = InStr(IniPos, StrIn, StrFin, Abs(Not ComparacionEstricta))
ya Sorry xP se me paso ¬¬", aunque igual con la comparacion de aquella linea no deja seguir (y mira que postee el formato en este hilo).
Edito:
Aun asi es un error grave!¡.
Dulce Infierno
claro, lo unico que yo nunca la usaria para buscar 2 palabras solas como mostro cobein , que se pueden repetir 500 veces en un texto, la usaria para buscar 2 cadenas bien largas e irrepetibles en el texto, como hice en el ejemplo de la web.
Cita de: seba123neo en 3 Junio 2010, 02:32 AM
claro, lo unico que yo nunca la usaria para buscar 2 palabras solas como mostro cobein , que se pueden repetir 500 veces en un texto, la usaria para buscar 2 cadenas bien largas e irrepetibles en el texto, como hice en el ejemplo de la web.
Si la verdad es que yo tambien cai en eso, pero no le di mucha importancia puesto que Si se repetia la palabra cogia dos como referencia... :silbar:
Salu2! ;)
Os aviso para que le echeis un vistazo al 1er post de nuevo, he simplificado y corregido la funcion con lo que djio Cobein, ahora funciona perfectamente, espero vuestra opinion... :-*
Salu2! ;)
EDITO:Corregidme si me equivoco, pero creo que seguimos teniendo un error...
Imaginar que tenemos esto y queremos desde el 1er "el" hasta el que va antes de "balcon":
Citar
el hombre de negro el que estaba en el balcon
Segun lo que hemos hecho, nos daria esto:
Citar
hombre de negro
cuando en realidad queremos esto:
Citar
hombre de negro el que estaba en
¿Os dais cuenta? Mas adelante publico solucion a esto... :P
Salu2!
no tiene caso ocupar nuevamente instr() si ya lo tienes en la variable pos2 y lo de mid()
Option Explicit
Public Function Text_Between_Words(Text As String, String1 As String, String2 As String) As String
Dim Pos1 As Integer, Pos2 As Integer, Start As Integer
Pos1 = InStr(Text, String1)
If Pos1 <> 0 Then Start = Pos1 + Len(String1): Pos2 = InStr(Start, Text, String2) Else Exit Function
If Pos2 <> 0 Then Text_Between_Words = Mid$(Text, Start, Pos2 - Start) Else Exit Function
End Function
Dulce Infierno Lunar!¡.
Jejejeje, gracias, se me escapo... :silbar:
Tampoco seria necesario el segundo Exit Function... :laugh:
Salu2! ;)
Cita de: seba123neo en 3 Junio 2010, 02:32 AM
claro, lo unico que yo nunca la usaria para buscar 2 palabras solas como mostro cobein , que se pueden repetir 500 veces en un texto, la usaria para buscar 2 cadenas bien largas e irrepetibles en el texto, como hice en el ejemplo de la web.
Entiendo lo que decis pero la funcion plantea una palabra y la que le sigue y el codigo NO hace eso por eso la modificacion.
Cita de: *PsYkE1* en 5 Junio 2010, 22:03 PM
Jejejeje, gracias, se me escapo... :silbar:
Tampoco seria necesario el segundo Exit Function... :laugh:
Salu2! ;)
Public Function Text_Between_Words(Text As String, String1 As String, String2 As String) As String
Dim Pos1 As Integer, Pos2 As Integer, Start As Integer
If Len(Text) > 0 Then
Pos1 = InStr(1, Text, String1)
If Pos1 > 0 Then
Start = Pos1 + Len(String1): Pos2 = InStr(Start, Text, String2)
If Pos2 > 0 Then Text_Between_Words = Mid$(Text, Start, Pos2 - Start)
End If
End If
End Function
Dulce Infierno Lunar!¡.
Ok, ya lo he corregido... :-*
¿Que opinais de esto que dije?
Cita de: *PsYkE1* en 5 Junio 2010, 03:47 AM
Corregidme si me equivoco, pero creo que seguimos teniendo un error...
Imaginar que tenemos esto y queremos desde el 1er "el" hasta el que va antes de "balcon":
Citar
el hombre de negro el que estaba en el balcon
Segun lo que hemos hecho, nos daria esto:
Citar
hombre de negro
cuando en realidad queremos esto:
Citar
hombre de negro el que estaba en
¿Os dais cuenta? Mas adelante publico solucion a esto... :P
Salu2! ;)