2017-02-06 14 views
1

名前リストに基づいてワークブックを保存するマクロを作成しました。 新しいリスト項目のいくつかに/があり、ファイル名に許可されていないため、saveAsエラーが発生します。スラッシュ間の単語のVBAファイル名

チーム、名前、リーグ、カップのリストがすべての行で変更されることに注意してください。

list item: team/ league 
    what I want: league 

    list item: team/league/cup      
    What I want: league-cup 

    List item; team/league/cup/score 
    what I want: league-cup-score 

私はそれが1つしかないが、残りの部分を見つけることができない最初のシナリオのために働いています。

InStr(Value, "/") > 0 Then 
filename = Right(Value, (Len(Value) - InStr(Value, "/"))) 
Else 
filename = Value 
End If 

これまでに得たものです。

おかげで、あなたは "/" に置き換える機能を置き換えVBAを使用することができ、あなたが既に持っているコードを使用して

答えて

7

あなたは、分割トリム、および参加ができます。たとえば

Function MakeFileName(s As String) As String 
    Dim v As Variant, w As Variant 
    Dim i As Long, n As Long 
    v = Split(s, "/") 
    n = UBound(v) 
    ReDim w(1 To n) 
    For i = 1 To n 
     w(i) = Trim(v(i)) 
    Next i 
    MakeFileName = Join(w, "-") 
End Function 

Sub test() 
    Debug.Print MakeFileName("team/ league") 
    Debug.Print MakeFileName("team/league/cup") 
    Debug.Print MakeFileName("team/league/cup/score") 
End Sub 

出力:

league 
league-cup 
league-cup-score 
2

" - " あなたが使用する必要が

filename = Replace(filename, "/", "-") 
1

をREPLACE

https://www.techonthenet.com/excel/formulas/replace_vba.php

例:

Dim oldString as String 
Dim newString as String 
newString=Replace(oldString,"/","_") 
+1

を使用することができます。しかし、リンクを残しておくと便利です(どんな理由であれ有用であるかもしれません)。しかし、回答自体にも意味のある内容を置きます。 –

+0

@Scott Holtzman私は自分の答えを編集します。 –

3

さらに別の解決策、InStrを使用してこの時間。リーグが存在しない場所を処理するために編集されました。

Sub Example() 
    Dim str1 As String: str1 = "list item: team/ league" 
    Dim str2 As String: str2 = "list item: team/league/cup " 
    Dim str3 As String: str3 = "List item; team/league/cup/score" 

    Debug.Print getTeamText(str1) 
    Debug.Print getTeamText(str2) 
    Debug.Print getTeamText(str3) 

End Sub 

Function getTeamText(ByVal StringIn As String) As String 
    Dim strPos As Long 
    Dim lookFor As String: lookFor = "league" 

    strPos = InStr(1, LCase(StringIn), lookFor) 

    If strPos > 0 Then 
     getTeamText = Replace(Replace(Mid(StringIn, strPos, (Len(StringIn) - strPos) + 1), " ", ""), "/", "-") 
    Else 
     getTeamText = "Could not find match" 
    End If 
End Function 

期待どおりの出力が必要です。

+0

良い解決策ですが、これはデータに依存します。 'StringIn'に' 'リーグ ''がない場合、コードは 'Run-time error' 5 'で破損します:無効な手続き呼び出しまたは引数' –

+0

が修正されました。 –

0

あなたは、リンクが今まで死ぬ場合、彼らは無意味なようにリンクにのみ答えを避けてください

filename = Join(Split(Replace(Replace(Value, " ", ""), "team/", ""), "/"), "-") 
+0

このユーザーの問題は解決しているかもしれませんが、将来この問題に遭遇するユーザーにとってはコード専用の回答はあまり役に立ちません。あなたのコードが元の問題を解決する理由を説明するために、あなたの答えを編集してください。 –

+0

@JoeC、「あなたは分割、トリム、ジョインすることができます」または「今度はInStrを使用する別のソリューションです。リーグが存在しない場所を処理するために編集されました。または "既に使用しているコードを使用すると、VBA置換機能を使用して"/"を" - "に置き換えたり、" REPLACEを使用する必要があります " – user3598756

関連する問題