

下記コードは「特定のシート(あいうえお、とします。)をコピーして、新しいブックを作り一定の範囲(A1:I38、とします)を値貼り付けし、一部(J:N、とします。)非表示にして任意の名前(L17に名前が出るようにしてありそれを引用してます)を付けて指定の場所(フェイクの為、適当。)へ保存する」という内容のものです。
Sub 保存()
Sheets("あいうえお").Copy
Range("A1:I38").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("J:N").Select
Selection.EntireColumn.Hidden = True
Dim fname As string
fname = Application.GetSaveAsFilename(InitialFileName:="C\:~~~" & Range("L17").Value)
If fname <> "false" Then
ActiveWorkbook.SaveAs Filename:=fname
End If
End Sub
ある時から、「型が一致しません」といったエラーが出るようになってしまいました。
何かをしたという記憶もありませんし、原因が思い当りません。。
自分で調べてみたのですが、どうにもわからなかったのでどうにかお力添えください…
ここに書いたもの以外で必要な情報があれば、できる限り出しますので教えてください。
宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
マクロを本格的に書く時は、Select をなくせと言います。
今の段階では、はっきりどこが間違いかというと、以下の部分だけです。
File名が、String 型なら、
>If fname <> "false" Then
この部分は間違っています。"False" です。
文字列をそのまま比較すると、binary 比較になってしまうからです。
StrComp 関数などもありますが、ややこしいので、戻り値のままに扱うか、
もしくは、以下のように Vartype 関数を利用します。
それ以上は、任意の部分に関しては、.Range("L17").Value が確実に代入できているか調べるぐらいしかありません。
'これで試してみていただけますか?
'パスの所は適当に変えてください。
Sub 保存2()
Dim fName As Variant
Dim buf As String
Dim wb As Workbook
Dim myPath As String
'必要に応じて書き換えてください。
myPath = ThisWorkbook.Path & "\" '末尾には必ず¥を入れてください。
Worksheets("あいうえお").Copy
Set wb = ActiveWorkbook
With ActiveSheet
.Range("A1:I38").Value = .Range("A1:I38").Value '値コピー
.Columns("J:N").EntireColumn.Hidden = True
buf = .Range("L17").Value
If Trim(buf) = "" Then
MsgBox "ファイル名がありません。", vbCritical
Exit Sub
End If
fName = Application.GetSaveAsFilename( _
InitialFileName:=myPath & buf, _
FileFilter:="Excel Files(xlsx(*.xlsx),xlsm(*.xlsm)", _
Title:="ファイル保存")
If VarType(fName) = vbBoolean Then
wb.Close False
Exit Sub
End If
End With
wb.SaveAs Filename:=fName, FileFormat:=xlOpenXMLWorkbook
wb.Close False
End Sub
No.6
- 回答日時:
エラーが出るシートでは(多分)
Sub test1()
Debug.Print "C\:~~~" & Range("L17").Value
End Sub
これでもエラーが出るでしょうね。
あるいは↓でも。
Sub test2()
MsgBox Range("L17").Value
End Sub
(エラーが出ない場合は文字列が長すぎる可能性もありますが)
↓で原因が判るのではないでしょうか。
Sub test3()
MsgBox TypeName(Range("L17").Value) & vbTab & CStr(Range("L17").Value)
End Sub
『Error エラー ####』
と表示されたらつまりRange("L17")がエラー値を返してるという事なのかな、と。
文字列とエラー値をくっつけようとして「型が一致しません」というエラーです。
数式の見直しをおすすめしますが
InitialFileName、つまりは初期設定値なのであまり気にしなくてよいのならとりあえずエラー値でも動く事優先で
fName = Application.GetSaveAsFilename(InitialFileName:="C\:~~~" & CStr(Range("L17").Value))
とすれば良いですよ :)
No.5
- 回答日時:
No.4の方の回答に近いのですが、
>fname = Application.GetSaveAsFilename~
以下をExcel2007で動作すること確認しました。
たぶんご質問者様のねらいに近いのではないかと思いますが。
fname = "C:\" & Range("L17").Value
If Range("L17") = "" Then
Application.Dialogs(xlDialogSaveAs).Show
Exit Sub
End If
ActiveWorkbook.SaveAs Filename:=fname
End Sub
No.4
- 回答日時:
確認はしていませんが
If fname <> "false" Then
ActiveWorkbook.SaveAs Filename:=fname
End If
の部分を
If fname = false Then Exit Sub
ActiveWorkbook.SaveAs Filename:=fname
に変更すればいいだけでは?

No.2
- 回答日時:
№1で回答した者ですがお礼を受けて再回答します。
String(文字列型)で宣言したfnameにVariant型のデータ(GetSaveAsFilenameの戻り値はVariant型)を格納しようとしているのがエラーの原因です。
fname = CStr(Application.GetSaveAsFilename(InitialFileName:="C\:~~~" & Range("L17").Value))
にすれば、文字列型にデータが返還されるのでエラーを回避できるでしょう。
ここでファイル名入力をキャンセルした場合、格納されるはずのFalseも文字列になります。
次の行のIf文は"false"のままでは認識してくれないと思います。
今、ExcelのインストールされているPCが手元にないので確認できませんが、”False”か”FALSE”にする必要があるでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル VBAでシートのコピーを作りたい 1 2023/05/18 07:42
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) マクロを短くする 1 2023/01/15 00:11
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
fortran おそらく二重解法のエラー
-
マクロで"#N/A"のエラー行を削...
-
scilabについて
-
ShapeのVBAの中での取り扱い
-
C言語で質問です。
-
ADOの_com_errorをエラー内容別...
-
書き込めない文字はどうすれば...
-
pythonのコードエラーについて
-
ASPでエクセル書き込み
-
LaTeXのエラーについて(コンパ...
-
携帯動画変換君で着フルもどき作成
-
Matlabの実行エラーについて
-
VC++2010で作成中に特定のエラ...
-
エラーの種類
-
VBA エラーが出てしまいます。...
-
ネットワーク上のPCにアクセス...
-
verilog で「*」を使って2の補...
-
Excel2003でVLookupは使用でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報