2015-01-13 26 views
7

VBAで拡張子なしのファイル名を取得する必要があります。私はActiveWorkbook.Nameプロパティを知っていますが、ユーザがWindowsプロパティHide extensions for known file typesをオフにしている場合、私のコードの結果は[Name.Extension]になります。どのように私はウィンドウのプロパティから独立したワークブックの名前だけを返すことができますか?拡張子のないファイル名VBA

ActiveWorkbook.Application.Captionでも試してみますが、このプロパティをカスタマイズすることはできません。

答えて

-5
strTestString = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1)) 

フルクレジット:すでにここに与えられたhttp://mariaevert.dk/vba/?p=162

+1

ファイル拡張子はないが、名前にドットがある場合は機能しません。 –

+0

いいえ?何が起こっているのか教えていただけますか?私はそれを逃している。 –

+2

考えてみましょう。 InStrRevを使ってドットを探しています。ファイル名が「John.And.Mary.Spreadsheet」の場合は、「拡張子を隠す」オプションがオンになっているので、どうでしょうか?今では、ファイルが "John.And.Mary"であり、ファイル拡張子が "Spreadsheet"であると考えています。 –

40

の答えは、限られた状況で動作しますが、確かにそれについて移動する最良の方法ではないことがあります。車輪を再構築しないでください。 Microsoft Scripting Runtime libraryFile System Objectには既にこれを行う方法があります。それはGetBaseNameと呼ばれています。これは、ファイル名のピリオドをそのまま扱います。

Public Sub Test() 

    Dim fso As New Scripting.FileSystemObject 
    Debug.Print fso.GetBaseName(ActiveWorkbook.Name) 

End Sub 

Public Sub Test2() 

    Dim fso As New Scripting.FileSystemObject 
    Debug.Print fso.GetBaseName("MyFile.something.txt") 

End Sub 

Instructions for adding a reference to the Scripting Library

+3

そこには存在しませんでしたか?いい答え。 –

+1

お元気でクラシックなアドバイス... –

+2

RbeerDuck このコマンドを実行すると、コンパイルエラー "ユーザー定義型が定義されていません" – Isu

0

延長の除去は、今の拡張機能の多様性を持っている ワークブック..ために実証されていることを詳細にできます。 。保存されていない新しいBook1には内線がありません 。ファイル

[コード]

機能WorkbookIsOpen(FWNa $、ブール= falseとオプションAnyExt)booleanとして

Dim wWB As Workbook, WBNa$, PD% 
FWNa = Trim(FWNa) 
If FWNa <> "" Then 
    For Each wWB In Workbooks 
     WBNa = wWB.Name 
     If AnyExt Then 
      PD = InStr(WBNa, ".") 
      If PD > 0 Then WBNa = Left(WBNa, PD - 1) 
      PD = InStr(FWNa, ".") 
      If PD > 0 Then FWNa = Left(FWNa, PD - 1) 
      ' 
      ' the alternative of using split.. see commented out below 
      ' looks neater but takes a bit longer then the pair of instr and left 
      ' VBA does about 800,000 of these small splits/sec 
      ' and about 20,000,000 Instr Lefts per sec 
      ' of course if not checking for other extensions they do not matter 
      ' and to any reasonable program 
      ' THIS DISCUSSIONOF TIME TAKEN DOES NOT MATTER 
      ' IN doing about doing 2000 of this routine per sec 

      ' WBNa = Split(WBNa, ".")(0) 
      'FWNa = Split(FWNa, ".")(0) 
     End If 

     If WBNa = FWNa Then 
      WorkbookIsOpen = True 
      Exit Function 
     End If 
    Next wWB 
End If 

エンド機能 [/コード]

-2

回答のために同様に機能しますここにいます: この回答は良いと思います。お試しください。 http://mariaevert.dk/vba/?p=162

+3

リンクを提供するだけではありません。あなたのリンクから情報を抽出し、あなたの答えに書いてください。 –

3

シンプルだがうまくいく

FileName = ActiveWorkbook.Name 
If InStr(FileName, ".") > 0 Then 
    FileName = Left(FileName, InStr(FileName, ".") - 1) 
End If 
関連する問題