Home |
Search |
Today's Posts |
|
#1
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Fri, 15 Feb 2008 21:36:13 -0500, Ron Rosenfeld
wrote: On Fri, 15 Feb 2008 18:07:05 -0800, John Gregory wrote: The text strings are random length - file path names: c:\sampledir1\filename - description In this example, I want to get the string "filename", but I have many directories, all with differnt length names. c:\samplelongname2\filename345 - longer description etc. In all cases I want to get the text between the "/" and the "-". The right and left functions do not work because the number of characters varies. Any ideas In your example, the - is surrounded by <space on both sides. If this is the case in your strings, it would be more robust to look for that sequence, than just for the "-". With your string in A1, here is a formula that will extract the string that is between the last "\" and the last "-" : =TRIM(MID(A1,1+FIND(CHAR(1),SUBSTITUTE(A1,"\",CHA R(1), LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))),-1+FIND(CHAR(1), SUBSTITUTE(A1,"-",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"-","")))) -FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1),LEN(A1)- LEN(SUBSTITUTE(A1,"\","")))))) --ron By the way, here are some UDF's that will do the same thing. They can be entered in a regular module and then used as a function. To enter into a regular module, <alt-F11 opens the VBEditor. Ensure your project is highlighted in the project explorer window, then Insert/Module and paste one of the codes below into the window that opens: ============================================= Option Explicit Function fn(str As String) As String Dim s1() As String Dim s2() As String s1 = Split(str, "\") s2 = Split(s1(UBound(s1)), "-") fn = Trim(s2(LBound(s2))) End Function ========================================== The above as a "one-liner" in deference to Rick: ============================================ Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split _ (str, "\"))), "-")(LBound(Split(Split _ (str, "\")(UBound(Split(str, "\"))), "-")))) End Function ========================================== and using Regular Expressions, which, although a bit longer, took a fraction of the time to develop and test of any of the other solutions. ================================ Option Explicit Function fn(str As String) As String Dim re As Object, mc As Object Set re = CreateObject("vbscript.regexp") re.Pattern = "\\([^\-\\]*\S)\s?-[^\\]*$" If re.test(str) = True Then Set mc = re.Execute(str) fn = mc(0).submatches(0) End If End Function ================================= --ron |
#2
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Fri, 15 Feb 2008 22:00:45 -0500, Ron Rosenfeld
wrote: and using Regular Expressions, which, although a bit longer, took a fraction of the time to develop and test of any of the other solutions. ================================ Option Explicit Function fn(str As String) As String Dim re As Object, mc As Object Set re = CreateObject("vbscript.regexp") re.Pattern = "\\([^\-\\]*\S)\s?-[^\\]*$" If re.test(str) = True Then Set mc = re.Execute(str) fn = mc(0).submatches(0) End If End Function ================================= OF course, the regular expression variation as posted above is wrong <g. Should read: ==================================== Option Explicit Function fn(str As String) As String Dim re As Object, mc As Object Set re = CreateObject("vbscript.regexp") re.Pattern = "\\([^\\]*\S)\s?-[^\\]*$" If re.test(str) = True Then Set mc = re.Execute(str) fn = mc(0).submatches(0) End If End Function ===================================== --ron |
#3
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
The above as a "one-liner" in deference to Rick:
LOL ============================================ Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split _ (str, "\"))), "-")(LBound(Split(Split _ (str, "\")(UBound(Split(str, "\"))), "-")))) End Function ========================================== The LBound for a Split is always 0 no matter what the Option Base is set to. Using this fact, your one-liner can be simplified considerably... Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split(str, "\"))), "-")(0)) End Function Rick |
#4
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Fri, 15 Feb 2008 23:00:40 -0500, "Rick Rothstein \(MVP - VB\)"
wrote: The above as a "one-liner" in deference to Rick: LOL ============================================ Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split _ (str, "\"))), "-")(LBound(Split(Split _ (str, "\")(UBound(Split(str, "\"))), "-")))) End Function ========================================== The LBound for a Split is always 0 no matter what the Option Base is set to. Using this fact, your one-liner can be simplified considerably... Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split(str, "\"))), "-")(0)) End Function Nice --ron |
#5
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Fri, 15 Feb 2008 23:00:40 -0500, "Rick Rothstein \(MVP - VB\)"
wrote: The above as a "one-liner" in deference to Rick: LOL ============================================ Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split _ (str, "\"))), "-")(LBound(Split(Split _ (str, "\")(UBound(Split(str, "\"))), "-")))) End Function ========================================== The LBound for a Split is always 0 no matter what the Option Base is set to. Using this fact, your one-liner can be simplified considerably... Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split(str, "\"))), "-")(0)) End Function And you've told me that before <grrr <slap upside my head --ron |
#6
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Fri, 15 Feb 2008 23:00:40 -0500, "Rick Rothstein \(MVP - VB\)"
wrote: The above as a "one-liner" in deference to Rick: LOL ============================================ Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split _ (str, "\"))), "-")(LBound(Split(Split _ (str, "\")(UBound(Split(str, "\"))), "-")))) End Function ========================================== The LBound for a Split is always 0 no matter what the Option Base is set to. Using this fact, your one-liner can be simplified considerably... Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split(str, "\"))), "-")(0)) End Function Rick Actually, neither your one liner nor my longer variants will work if filename includes a "-". For that, we need something like: ============================== Option Explicit Function fn(str As String) As String Dim s1() As String s1 = Split(str, "\") s1 = Split(s1(UBound(s1)), "-") ReDim Preserve s1(UBound(s1) - 1) fn = Trim(Join(s1, "-")) End Function =========================== --ron |
#7
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]() "Ron Rosenfeld" wrote in message ... On Fri, 15 Feb 2008 23:00:40 -0500, "Rick Rothstein \(MVP - VB\)" wrote: The above as a "one-liner" in deference to Rick: LOL ============================================ Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split _ (str, "\"))), "-")(LBound(Split(Split _ (str, "\")(UBound(Split(str, "\"))), "-")))) End Function ========================================== The LBound for a Split is always 0 no matter what the Option Base is set to. Using this fact, your one-liner can be simplified considerably... Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split(str, "\"))), "-")(0)) End Function Rick Actually, neither your one liner nor my longer variants will work if filename includes a "-". For that, we need something like: ============================== Option Explicit Function fn(str As String) As String Dim s1() As String s1 = Split(str, "\") s1 = Split(s1(UBound(s1)), "-") ReDim Preserve s1(UBound(s1) - 1) fn = Trim(Join(s1, "-")) End Function =========================== I thought I had corrected it as per your observation after the OP posted his sample text line ... use " - ", not "-", in the one-liner... Function fn(str As String) As String fn = Trim(Split(Split(str, "\")(UBound(Split(str, "\"))), " - ")(0)) End Function Of course, this supposes the filename itself does not contain dash surrounded by spaces. Rick |
#8
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
Actually, neither your one liner nor my longer variants will work if
filename includes a "-". For that, we need something like: ============================== Option Explicit Function fn(str As String) As String Dim s1() As String s1 = Split(str, "\") s1 = Split(s1(UBound(s1)), "-") ReDim Preserve s1(UBound(s1) - 1) fn = Trim(Join(s1, "-")) End Function =========================== And, of course, the above would not work if the description itself contained a dash. Rick |
#9
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
Actually, neither your one liner nor my longer variants will work if
filename includes a "-". For that, we need something like: ============================== Option Explicit Function fn(str As String) As String Dim s1() As String s1 = Split(str, "\") s1 = Split(s1(UBound(s1)), "-") ReDim Preserve s1(UBound(s1) - 1) fn = Trim(Join(s1, "-")) End Function =========================== And, of course, the above would not work if the description itself contained a dash. In thinking a little more about this question, it would appear, given the structure the OP has adopted, that **at least one** of the following must be true or the OP cannot have a fool-proof parser... the filename can never have a dash, or it can never have a space/dash/space combination in it, or it can never have just a plain space in it (which would further require a space always be present after the filename), or the description cannot have a backslash in it... one of these must be true in order to create a parser (one-liner or not) that would always work. Rick |
#10
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Sat, 16 Feb 2008 11:09:37 -0500, "Rick Rothstein \(MVP - VB\)"
wrote: Actually, neither your one liner nor my longer variants will work if filename includes a "-". For that, we need something like: ============================== Option Explicit Function fn(str As String) As String Dim s1() As String s1 = Split(str, "\") s1 = Split(s1(UBound(s1)), "-") ReDim Preserve s1(UBound(s1) - 1) fn = Trim(Join(s1, "-")) End Function =========================== And, of course, the above would not work if the description itself contained a dash. In thinking a little more about this question, it would appear, given the structure the OP has adopted, that **at least one** of the following must be true or the OP cannot have a fool-proof parser... the filename can never have a dash, or it can never have a space/dash/space combination in it, or it can never have just a plain space in it (which would further require a space always be present after the filename), or the description cannot have a backslash in it... one of these must be true in order to create a parser (one-liner or not) that would always work. Rick That sounds correct. And, at least for the parser's I've offered, the filename must be preceded by a "\" --ron |
#11
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
On Sat, 16 Feb 2008 11:09:37 -0500, "Rick Rothstein \(MVP - VB\)"
wrote: Actually, neither your one liner nor my longer variants will work if filename includes a "-". For that, we need something like: ============================== Option Explicit Function fn(str As String) As String Dim s1() As String s1 = Split(str, "\") s1 = Split(s1(UBound(s1)), "-") ReDim Preserve s1(UBound(s1) - 1) fn = Trim(Join(s1, "-")) End Function =========================== And, of course, the above would not work if the description itself contained a dash. In thinking a little more about this question, it would appear, given the structure the OP has adopted, that **at least one** of the following must be true or the OP cannot have a fool-proof parser... the filename can never have a dash, or it can never have a space/dash/space combination in it, or it can never have just a plain space in it (which would further require a space always be present after the filename), or the description cannot have a backslash in it... one of these must be true in order to create a parser (one-liner or not) that would always work. Rick Expanding -- it would certainly be possible for a parser in which the "\" preceding the filename was optional --ron |
#12
![]()
Posted to microsoft.public.excel.misc
|
|||
|
|||
![]()
In thinking a little more about this question, it would appear, given the
structure the OP has adopted, that **at least one** of the following must be true or the OP cannot have a fool-proof parser... the filename can never have a dash, or it can never have a space/dash/space combination in it, or it can never have just a plain space in it (which would further require a space always be present after the filename), or the description cannot have a backslash in it... one of these must be true in order to create a parser (one-liner or not) that would always work. Expanding -- it would certainly be possible for a parser in which the "\" preceding the filename was optional Which is, of course, a possibility; though, in today's type file referencing, somewhat rare. If the default path is at the directory where the file is located, then you can legally specify the file using something like this... c:filename.ext and the operating system will look in the current directory. On my system, there is a directory called TEMP at the root level of my C: drive. In that directory is a file named Test.txt. The following code (showing a 'backslashless' path reference) prints the first line of the file into the Immediate window... Sub test() ChDir "c:\temp" Open "c:test.txt" For Input As #1 Line Input #1, LineOfText Close #1 Debug.Print LineOfText End Sub Rick |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
IF a cell contains specific text | Excel Discussion (Misc queries) | |||
cell location containing specific text | Excel Worksheet Functions | |||
Macro - Select cell with no text | Excel Worksheet Functions | |||
Select cell containing specific text &return value from another ce | Excel Worksheet Functions | |||
Select specific cell | Excel Discussion (Misc queries) |