2016-03-30 18 views
3

新しいブックを追加し、シートの特定のセルにある日付に基づいてブックを保存し、名前を付けるために、次のコードを使用しています。SaveAsは "。"を含む文字列を受け入れません。 Excel VBA

Dim wb As Workbook 
Dim wbName As String 
wbName = ThisWorkbook.Sheets("Sheet1").Range("M145").value 


    fName = Application.GetSaveAsFilename(wbName) 
    If fName = False Then 
     MsgBox "Publish couldn't be completed since you didn't choose where to save the file." 
     Exit Sub 
    Else 
     Set wb = Workbooks.Add 
     wb.SaveAs (fName) 
    End If 

しかし、セル「M145」は 『31.3.16』のようにドット(「」)が含まれていたときに、私のファイル名がプロンプト名前を付けて保存に表示されていないようだと、私は のない空白行を参照してくださいエラーメッセージ。

これはこれとは関係ありませんが、私のシートは右から左です。誰もがこれを修正する方法のアイデアを持っていますか?

+0

'wbname'で' cstr'を試してみませんか? – findwindow

+0

あなたは確信していますか?デバッガを使って、 'wbName'で割り当てられた値があなたの考えであることを確認します。 –

+0

これは私にとっては、右から左、または左から右を使用して動作します。 –

答えて

6

私はおそらくあなたがFileDialogオブジェクトとのより良い運を持っていますが、エラーを複製することはできませんよ中:

Dim wb As Workbook 
Dim wbName As String 
Dim fdlg As FileDialog 

wbName = ThisWorkbook.Sheets("Sheet1").Range("M145").value 

Set fdlg = Application.FileDialog(msoFileDialogSaveAs) 
With fdlg 
    .InitialFileName = wbName 
    .Show 
    Set wb = Workbooks.Add 
    On Error Resume Next 'Suppress any errors due to invalid filename, etc. 
    wb.SaveAs(fdlg.SelectedItems(1)) 
    If Err.Number <> 0 Then 
     MsgBox "Publish couldn't be completed since you didn't choose where to save the file." 
     wb.Close False 'Get rid of the workbook since it's not being saved 
     Exit Sub 
    End If 
    On Error GoTo 0 'Resume normal error handling 
End With 
+0

このコードは完全に動作するようです。どうもありがとうございます。 – Sergey

+0

よろしくお願いします。 'fName = Application.GetSaveAsFilename(" 31.3.16 ")'のようにハードコーディングすれば、何が起こるのか不思議です。 –

+0

fName = Application.GetSaveAsFilename( "31.3.16")は動作しません.. – Sergey

2

あり、ここで起こって二つのことが。

最初に、M145には、フォーマットマスクがdd\.mm\.yyとなっている日付が含まれている可能性があります。表示された値をセルから変数に取り込むには、Range.Value propertyではなく、Range.Text propertyが必要です。

第2に、Application.GetSaveAsFilename methodのデフォルトのファイルタイプは*.*です。つまり、ファイル拡張子として.yyを受け入れることを意味します。使用可能なファイル拡張子をExcelファイルタイプに制限する必要があります。

Dim wb As Workbook 
Dim wbName As String, fName As Variant 'variant in case user clicks Cancel 

wbName = ThisWorkbook.Sheets("Sheet1").Range("M145").Text 

With Application 
    fName = .GetSaveAsFilename(InitialFileName:=wbName, _ 
           FileFilter:="Excel Workbook (*.xlsx), *.xlsx," & _ 
              "Macro Workbook (*.xlsm), *.xlsm," & _ 
              "Binary Workbook (*.xlsb), *.xlsb") 
End With 

これにより、ファイル名の選択に関する問題が解決されます。ただし、Workbook.SaveAs methodも正しいXlFileFormat Enumerationを提供する必要があります。

Select Case fName 
    Case False 
     'user clicked Cancel or Close (×) 
     Debug.Print fName 
    Case Else 
     With Workbooks.Add 
      Select Case Right(fName, 5) 
       Case ".xlsx" 
        .SaveAs Filename:=fName, FileFormat:=xlOpenXMLWorkbook 
       Case ".xlsm" 
        .SaveAs Filename:=fName, FileFormat:=xlOpenXMLWorkbookMacroEnabled 
       Case ".xlsb" 
        .SaveAs Filename:=fName, FileFormat:=xlExcel12 
       Case Else 
        'there really shouldn't be a case else 
      End Select 
     End With 
End Select 
+0

良いことですが、OPはすでに 'String'型にキャストしており、' wbName'に文字列が含まれていることをデバッガ経由で確認しています。 Date/Longデータ型が 'InitialFileName'でこの現象を引き起こすかどうかわからない –

+1

fNameの扱い方は、コンピュータの短い日付が表示されるように設定されていますが、.Textプロパティは.Valueは、ワークシートが示すものを与えるものであり、数式バーではありません。さらに、私の実験では、 '。*'ファイルフィルタを使って.yyを切り落としていました。 – Jeeped

+0

私は実際に.Textを使用しようとしましたが、同じ結果を返しました – Sergey

関連する問題