• ベストアンサー

set文でエラーがでます

以下のコードで  実行エラー''9'「インデックスが有効範囲にありません。」が出る原因と対処方法を教えてください。 Set ws = Worksheets(FileName2) FilewName2はローカルウインドウでは問題なく表示されています。 Sub 括弧及び括弧内文字削除() ' 'ダイアログでターゲットファイル(txt)を選択(読み込み) --------------- Dim FileName As Variant Dim FileName2 As String Dim FilePath As String Dim fso As New FileSystemObject FileName = Application.GetOpenFilename(FileFilter:="Txtファイル,*.txt) If FileName = False Then Exit Sub End If 'ターゲットファイルの拡張子無しのファイル名を取得 FileName2 = fso.GetBaseName(FileName) 'ターゲットファイルのパス取得 FilePath = Replace(FileName, Dir(FileName), "") Workbooks.Open FileName '括弧内文字列削除(括弧も含む)-------------------------------- Dim RegExp As Object Dim Cell As Range Dim tr As Long 'DATAを処理する行数 tr = Cells(Rows.Count, "A").End(xlUp).Row Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = "[((].*[))]" ' Application.ScreenUpdating = False Dim buf Dim i As Long With Range("A1", Cells(Rows.Count, "A").End(xlUp)) buf = .Value For i = 1 To UBound(buf) buf(i, 1) = RegExp.Replace(buf(i, 1), "") Next .Value = buf End With ' Range(Cells(1, 1), Cells(tr, 1)).Select ' For Each Cell In Selection ' Cell = RegExp.Replace(Cell, "") ' Next '新規に修正ファイルをテキストファイルに書き出す ------------- Dim ws As Worksheet Set ws = Worksheets(FileName2) Dim datFile As String datFile = FilePath & FileName2 & "_mod.srt" Open datFile For Output As #1 For i = 1 To tr Print #1, ws.Cells(i, "A").Value Next Close #1 Application.ScreenUpdating = True MsgBox datFile & "に書き出しました" & vbCrLf & _ "処理が終了したのでEXCELを閉じて終了です。" '// Excelを終了する Application.Quit ActiveWorkbook.Close SaveChanges:=False ThisWorkbook.Close SaveChanges:=False End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.11

> 保存(utf8)し起動させました。 こちらもUTF-8だとエラーになりました。 中に全角文字があるのでS-JISじゃないと駄目っぽいですね。 実行コードをワンクリックで実行できたらいいかもと思ってのVBS、VB.NETだったのですが エクセルでも Private Sub Workbook_Open() にコードを書いてそこで最後にクローズしておけばワンクリックでできるので余談も余談でした。

NuboChan
質問者

補足

なるほど、ここでも文字コードの問題があるのですね。 こちらでもShift_Jisで保存してエラーが出ないのを確認しました。 最後までお世話をおかけしました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (10)

  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.10

回答No.6へのお礼を見る前に回答No.8を投稿してました No.8の それは無理な事だとなるとやばいので は 私ができないとかになるとやばいので という意味です。 なんかあとから読んだらNuboChanさんができないとやばいとも読めるなと思ったので訂正しておきます。

NuboChan
質問者

お礼

vbsのコードをありがとうございます。 せっかくコードをもらったので kkkkkmさんもコードを「test.vbs」で保存(utf8)し起動させました。 添付画像のようなエラーが出てストップしました。 https://imgur.com/Qw1wXdK VBAのようなローカルウインドウ等のエラー時に利用できる環境がVBSには無いようなので DOSコマンド的に思えて初心者が簡単に手を出す事は出来そうにありません。 この件(VBS,VB.NET)は深追いしない方が良さそううです。 お世話になり今回も解決しました。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.9

FileName2 = fso.GetBaseName(FileName) が2か所あるのはVBAからコピペした時に元々あったのがそのまま存在してるからで1カ所でいけます。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.8

> VBSとかVB.NETでやってしまえば と言ってそれは無理な事だとなるとやばいのでVBSで試したら ほぼVBAと同じでできました。 ファイルを開くダイアログだけはエクセルの力を借りないとできないみたいだったのですがあとはそのままコピペでした。 変数の型指定はできないみたいでした。 Option Explicit Dim FileName Dim FileName2 Dim buf Dim fso Dim RegExp Dim FilePath Dim datFile FileName = SelectFile("srtファイル(*.srt),*.srt") If FileName <> "" Then Set fso = CreateObject("Scripting.FileSystemObject") '拡張子無しのファイル名を取得 FileName2 = fso.GetBaseName(FileName) 'MsgBox FileName2 With fso.GetFile(FileName).OpenAsTextStream buf = .ReadAll .Close End With Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = "[((].*[))]" buf = RegExp.Replace(buf, "") FileName2 = fso.GetBaseName(FileName) FilePath = fso.GetParentFolderName(FileName) 'Replace(FileName, Dir(FileName), "") Dirが使えなかったので↑のように datFile = FilePath & "\" & FileName2 & "_mod.srt" With fso.OpenTextFile(datFile, 2, True) .Write buf .Close End With Else MsgBox "キャンセルされました" End If 'https://yozda.exblog.jp/240328377/ 'ファイルを開くダイアログ Function SelectFile(sFilter) Dim r: r = "" On Error Resume Next Dim objExcel Set objExcel = CreateObject("Excel.Application") Dim s s = objExcel.GetOpenFilename(sFilter) If VarType(s) <> vbBoolean Then r = s objExce.Quit On Error GoTo 0 SelectFile = r End Function

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.7

テキストファイルを直接操作する場合VBAでなくてもVBSとかVB.NETでやってしまえばいいような気もします。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.6

> 最初のアプローチでブックを作成する事にしたのが悪かったみたいで そんなに悪くは無いと思います一行ずつセルに読み込むよりOpenだけでいいのでコードは短くなりますし。 > 「括弧削除.xlsm」のみで処理する方が良さそうだと考えるようになりました。 ファイルをbufに読み込んでそのまま RegExp.してしまうのが早いとは思います。 コードも短くなると思います。 こんな感じでいけそうです。 Sub Test() Dim FileName As Variant Dim buf As String Dim fso As New FileSystemObject Dim RegExp As Object Dim FileName2 As String Dim FilePath As String Dim datFile As String FileName = Application.GetOpenFilename(FileFilter:="Txtファイル/Srtファイル,*.txt;*.srt") If FileName = False Then Exit Sub End If With fso.GetFile(FileName).OpenAsTextStream buf = .ReadAll .Close End With Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = "[((].*[))]" buf = RegExp.Replace(buf, "") FileName2 = fso.GetBaseName(FileName) FilePath = Replace(FileName, Dir(FileName), "") datFile = FilePath & FileName2 & "_mod.srt" With fso.OpenTextFile(datFile, 2, True) .Write buf .Close End With End Sub

NuboChan
質問者

お礼

他のブックを作成せずにテキストファイルをセルに書き出さずに一気に処理する方法をありがとうございます。 bufにに一気に読み込み、書き出す事が中々理解できずに時間がかかりました。 (ネットの情報を読み込んで何とかコードが少しは理解できるまでなりました。) >テキストファイルを直接操作する場合VBAでなくてもVBSとかVB.NETでやってしまえばいいような気もします。 ここで言う「VBS」とは、VBScriptの事ですよね。 「VB.NET」を含めて利用したことが無いので門外漢でほとんどEXCELのVBAで処理しています。 と言うか、昔、BASIC言語を少しやっただけの古い人間でそれ以外はむずかしそうで手が出せそうにありません。 Option Explicit Sub 括弧及び括弧内の文字列削除_2() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim FileName As Variant '処理するテキストファイルを指定 (text,srt) FileName = Application.GetOpenFilename(FileFilter:="Txtファイル/Srtファイル,*.txt;*.srt") If FileName = False Then Exit Sub End If Dim buf As String 'テキストファイル内の全ての文字を読み込みモード(1)でデータを一気に読み込む With fso.GetFile(FileName).OpenAsTextStream(1) buf = .ReadAll .Close End With Dim RegExp As Object Set RegExp = CreateObject("VBScript.RegExp") 'buf文字列中から括弧内の文字列(含む括弧)を削除して ---> bufに書き戻す RegExp.Global = True RegExp.Pattern = "[((].*[))]" buf = RegExp.Replace(buf, "") Dim FileName2 As String Dim FilePath As String FileName2 = fso.GetBaseName(FileName) FilePath = Replace(FileName, Dir(FileName), "") Dim datFile As String datFile = FilePath & FileName2 & "_mod.srt" 'テキストファイルを開いて一気に書き込む ' 書き込みモード= 2 ' 新たに作成するときは = True ' (書き込み)format = 0 ---> ASCIIファイルで書き出す With fso.OpenTextFile(datFile, 2, True, 0) .Write buf 'bufの内容を書き出す .Close End With Set fso = Nothing End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.5

> しかし、以下のコードでエラー(実行エラー9:「インデックスが有効範囲 > にありません。」となります。 > Set wbs = wb.Worksheets(FileName) シート名はFileName2なので Set wbs = wb.Worksheets(FileName2) じゃないとエラーになると思います。 FileName2を取得した後に記載してください。 以降のセル指定がwbsになっているみたいなので その下の方に Dim ws As Worksheet Set ws = wb.Worksheets(FileName2) がありますからそこを Dim wbs As Worksheet Set wbs = wb.Worksheets(FileName2) にしてみたらいいと思います。

NuboChan
質問者

お礼

ありがとうございます。 アドバイスを元にコードを書き換えてエラー無く上手く処理できました。 1)「括弧削除.xlsm」起動 2)「括弧削除.xlsm」のModule1にある「Sub 括弧及び括弧内の文字列削除()」を実行 3) 「Set wb = Workbooks.Open(FileName)」で「SJ_test_001」ブックが作成されて    「SJ_test_001」ブックのシート1の名前は、「SJ_test_001」となる 4)「FileName2 = fso.GetBaseName(FileName)」と  「Set wbs = wb.Worksheets(FileName2)」でwbsを取得 5)以下wbsシートを元に処理作業を行うのでwbs.となる 1) - 5) のように考えると思うのですがここで一つ疑問です。 初めに「括弧削除.xlsm」起動していますが わざわざ「SJ_test_001」ブックを作成して「括弧削除.xlsm」は以後利用されていません。 「SJ_test_001」を作らずに「括弧削除.xlsm」のみで処理できるのではと考えました。 最初のアプローチでブックを作成する事にしたのが悪かったみたいで 「括弧削除.xlsm」のみで処理する方が良さそうだと考えるようになりました。 この考え方は的を得てますか? Option Explicit Sub 括弧及び括弧内の文字列削除() ' 'ダイアログでターゲットファイル(txt)を選択(読み込み) --------------- Dim FileName As Variant Dim FileName2 As String Dim FilePath As String Dim fso As New FileSystemObject FileName = Application.GetOpenFilename(FileFilter:="Txtファイル/Srtファイル,*.txt;*.srt") If FileName = False Then Exit Sub End If Dim wb As Workbook Set wb = Workbooks.Open(FileName) 'ターゲットファイルの拡張子無しのファイル名を取得 FileName2 = fso.GetBaseName(FileName) Dim wbs As Worksheet Set wbs = wb.Worksheets(FileName2) 'ターゲットファイルのパス取得 FilePath = Replace(FileName, Dir(FileName), "") '括弧内文字列削除(括弧も含む)-------------------------------- Dim RegExp As Object Dim Cell As Range Dim tr As Long 'DATAを処理する行数 tr = wbs.Cells(Rows.Count, "A").End(xlUp).Row Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = "[((].*[))]" ' Application.ScreenUpdating = False Dim buf Dim i As Long Stop With wbs.Range("A1", wbs.Cells(Rows.Count, "A").End(xlUp)) buf = .Value For i = 1 To UBound(buf) buf(i, 1) = RegExp.Replace(buf(i, 1), "") Next .Value = buf End With ' Range(Cells(1, 1), Cells(tr, 1)).Select ' For Each Cell In Selection ' Cell = RegExp.Replace(Cell, "") ' Next '新規に修正ファイルを作成して削除結果をテキストファイルに書き出す ------------- Dim datFile As String datFile = FilePath & FileName2 & "_mod.srt" '新規作成のファイル名 Open datFile For Output As #1 For i = 1 To tr Print #1, wbs.Cells(i, "A").Value Next Close #1 Application.ScreenUpdating = True MsgBox datFile & "に書き出しました。(同名ファイルがある場合は、上書き)" & vbCrLf & _ "処理が終了したのでEXCELを閉じて終了です。" '// Excelを終了する Application.Quit ActiveWorkbook.Close SaveChanges:=False ThisWorkbook.Close SaveChanges:=False End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.4

Worksheets("SJ_test_001").Activate はシートが存在するブックがアクティブになっていないと 「インデックスが有効範囲にありません。」 になると思います。 Dim wb As Workbook Set wb = Workbooks.Open(FileName) としたあとで wb.Activate とブックをアクティブにしておけば、それ以降他のブックやシートがアクティブにならない限り正常な結果になると思います。 ただ、わざわざアクティブにしなくても、新しくブックを開いたら他をアクティブにしない限りそれがアクティブになった状態のまま先に進むと思いますので、今回何故そうなったのか不思議な感じです。 なので、wb.Activateのあとで別のブック(マクロ実行しているブックとか)がアクティブになれば、同じような事になるのではないでしょうか。 ですので、ブックやシートがアクティブであることを前提にしない方が個人的にはいいのではと思います。 Dim wb As Workbook Set wb = Workbooks.Open(FileName) Dim ws As Worksheet Set ws = wb.Worksheets(FileName2) その後のセルアクセスはすべてws指定 みたいにしてアクティブ関係なしにしておくととりあえず安心かもしれません。

NuboChan
質問者

お礼

アドバイスありがとうございます。 どのシートにアクセスするのかはっきりさせるために アドバイスを元に以下のように「括弧及び括弧内の文字列削除()」のコード見直してみました。 しかし、以下のコードでエラー(実行エラー9:「インデックスが有効範囲にありません。」となります。 Set wbs = wb.Worksheets(FileName) どうもアドバイスが理解できていないようです。 Sub 括弧及び括弧内の文字列削除() ' 'ダイアログでターゲットファイル(txt)を選択(読み込み) --------------- Dim FileName As Variant Dim FileName2 As String Dim FilePath As String Dim fso As New FileSystemObject FileName = Application.GetOpenFilename(FileFilter:="Txtファイル/Srtファイル,*.txt;*.srt") If FileName = False Then Exit Sub End If Dim wb As Workbook Set wb = Workbooks.Open(FileName) Dim wbs As Worksheet Set wbs = wb.Worksheets(FileName) 'ターゲットファイルの拡張子無しのファイル名を取得 FileName2 = fso.GetBaseName(FileName) Dim ws As Worksheet Set ws = wb.Worksheets(FileName2) 'ターゲットファイルのパス取得 FilePath = Replace(FileName, Dir(FileName), "") 'Workbooks.Open FileName '括弧内文字列削除(括弧も含む)-------------------------------- Dim RegExp As Object Dim Cell As Range Dim tr As Long 'DATAを処理する行数 tr = wbs.Cells(Rows.Count, "A").End(xlUp).Row Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = "[((].*[))]" ' Application.ScreenUpdating = False Dim buf Dim i As Long Stop With wbs.Range("A1", wbs.Cells(Rows.Count, "A").End(xlUp)) buf = .Value For i = 1 To UBound(buf) buf(i, 1) = RegExp.Replace(buf(i, 1), "") Next .Value = buf End With ' Range(Cells(1, 1), Cells(tr, 1)).Select ' For Each Cell In Selection ' Cell = RegExp.Replace(Cell, "") ' Next '新規に修正ファイルを作成して削除結果をテキストファイルに書き出す ------------- Dim datFile As String datFile = FilePath & FileName2 & "_mod.srt" '新規作成のファイル名 Open datFile For Output As #1 For i = 1 To tr Print #1, ws.Cells(i, "A").Value Next Close #1 Application.ScreenUpdating = True MsgBox datFile & "に書き出しました。(同名ファイルがある場合は、上書き)" & vbCrLf & _ "処理が終了したのでEXCELを閉じて終了です。" '// Excelを終了する Application.Quit ActiveWorkbook.Close SaveChanges:=False ThisWorkbook.Close SaveChanges:=False End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.3

あと エラーになるコードで Dim ws As Worksheet Set ws = Worksheets(FileName2) の前に Debug.Print Worksheets(1).Name として実際のシート名が何なのかを一応確認してみてはいかがでしょう。

NuboChan
質問者

お礼

アドバイスありがとうございます。 >エラーにはなりませんでした。 >SJ_test_001.srtがアクティブになっていないとエラーになりますが、 >他のブックがアクティブになるようなこともない感じなのですが アドバイスを頂いて、よくよく考えてみるとエラーが出た時は このマクロを起動するときに同時に他のexcelを起動していたような記憶があります。 ただ、参考画像を取ったときは他のシートを起動していなかったのですが この時はエラーが出るかはチェックしませんでした。 今となっては再現性が無く、試しに他のexcelは起動しない単独の状態で アドバイスにある修正をせずにマクロを実行するとエラーが出ませんでした。 このことより、エラー原因は他のexcelがアクティブになっていた可能性が大きいです。 このマクロは、単独が基本ですが他のexcelを同時に起動させる事もあるかも知れないので 今回の場合は、(SJ_test_001)ですがこのシートをアクティブにする 以下のようなコードを追加すれば不具合は解消しますか ? Worksheets("SJ_test_001").Activate

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.2

> FileName2と同じ名前のシートは存在します。 すみません確認不足でした実行してみたら確かにシートが存在しました、ただエラーにはなりませんでした。 SJ_test_001.srtがアクティブになっていないとエラーになりますが、他のブックがアクティブになるようなこともない感じなのですが とりあえず念のために Workbooks.Open FileName のすぐ後に Dim ws As Worksheet Set ws = Worksheets(FileName2) とするとか Workbooks.Open FileName のところをがちがちにかためて Dim wb As Workbook Set wb = Workbooks.Open(FileName) Dim ws As Worksheet Set ws = wb.Worksheets(FileName2) とかにしておいて その後のセルアクセスはすべてws指定にしておけばいかがでしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.1

FileName2と同じ名前のシートが無いのではないでしょうか。

NuboChan
質問者

お礼

kkkkkmさん、毎度おせわになります。 FileName2と同じ名前のシートは存在します。 以下の参考画像を見てください。 https://imgur.com/d5P8i3o 括弧削除.xlsmを起動直後は①の状態です。 括弧削除.xlsm内のマクロを起動して  以下のようにStopで停止した時点の状態では②のようになります。   '新規に修正ファイルをテキストファイルに書き出す ------------- Stop Dim ws As Worksheet アドバイスの内容が理解できていないのでとんちんかんな回答であればすいません。 ご指導ください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAのハイパーリンクにつきまして

    以前に質問をさせていただき、こちらでベストアンサーを決定した後に急きょ変更があったところがあり、わからなくなってしまいこちらに戻ってきた次第です。 http://okwave.jp/qa/q8743521.html にて質問をさせていただきました内容について、以下のVBAで解決できております。 しかし、抽出したファイル名にハイパーリンクが欲しいという要望を受けてしまいました。 ハイパーリンクのVBAについていろいろ調べましたが、この記述方法に追加して実行する方法が全く分かりませんでした。 お分かりになる方がいましたら、この内容にハイパーリンクをつける方法をお教えいただけますでしょうか。よろしくお願いいたします。 Sub Macro1() Dim i As Long Dim myPath As String, Flnm As String ReDim Flnmfp(0) As String Dim WS1 As worksheet Set WS1=ThisWorkbook.sheets("sheet1") myPath="望みのフォルダパスを入力" Call fpFileName(myPath, Flnmfp ) 'フォルダ内のファイル名取得 If Ubound(Flnmfp)=0 Then 'フォルダにファイルが無ければ終了 Exit Sub End if For i =1 to Ubound(Flnmfp) Workbooks.open filename := Flnmfp(i) Flnm=Dir(Flnmfp(i)) With Workbooks(Flnm).sheets("sheet1") WS1.Cells(2, i).value=.Range("G5").value WS1.Cells(3, i).value=.Range("G6").value WS1.Cells(4, i).value=.Range("K7").value WS1.Cells(5, i).value=CStr(.Range("G9").value) & CStr(.Range("N9").value) & CStr(.Range("P9").value) '同じ要領で望みのセルを記入する WS1.Cells(8, i).value=Flnm End with Workbooks(Flnm).close Savechanges:=False Next i End Sub Sub fpFileName(ByVal myPath As String, ByRef Flnmfp() As String) 'サブフォルダも含め全部のxlsファイル名をフルパスで取得する   Dim cnt As Long, buf As String, f As Object   buf = Dir(myPath & "\*.xls")   Do While buf <> ""     cnt = Ubound(Flnmfp) + 1 ReDim Preserve Flnmfp(cnt)     Flnmfp(cnt)= myPath & "\" & buf     buf = Dir()   Loop   With CreateObject("Scripting.FileSystemObject")     For Each f In .GetFolder(myPath).SubFolders       Call fpFileName(f.Path, Flnmfp)     Next f   End With End Sub

  • シート1の氏名をシート2に反映

    sheet1の氏名をsheet2の日付、記号(A,B,C)にマッチした位置に入力させたいのですが下記コードで他で試したのですがうまくいきません。どなたかコードが解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long, k As Long, L As Long Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)) j = wS2.Cells(3, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 2), wS2.Cells(i, j)).ClearContents On Error Resume Next For i = 2 To wS1.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountA(wS1.Rows(i)) > 1 Then For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(wS1.Cells(i, 4), wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)), False) L = WorksheetFunction.Match(wS1.Cells(5, j), wS2.Rows(3), False) wS2.Cells(k, L) = wS1.Cells(i, j) End If Next j End If Next i End Sub

  • VBAで、定数式が必要ですのエラー対応

    指定のファイルをフォルダAからフォルダBへ移動させるというvbaを 見つけたのですが、 サンプルの表記は「"C:\Data\A"」と直接場所をしていしたものなので、 参照するフォルダ場所として、セルC1を参照させようと、 「Range("C1")」と書き直したところ、 「コンパイルエラー:定数式が必要です」とエラーになってしまいます。 どの様に書き直せばよいのでしょうか? どなたかご存じでしたら、ぜひお教え下さい。 よろしくお願いします。 エクセル2010を使用しています。 Sub CheckAndMoveFiles() Const FolderA = Range("C1") 'エラー発生 'Const FolderA = "C:\Data\A" サンプルの表記   Const FolderB = "C:\Data\B" Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim ws As Worksheet Set ws = ActiveSheet Dim lastRow As Long lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row Dim r As Long Dim fileName As String For r = 1 To lastRow If ws.Cells(r, "A").Value <> "" Then ' fileName = ws.Cells(r, "A").Value & ".xls" fileName = ws.Cells(r, "A").Value If fso.FileExists(FolderA & "\" & fileName) = True Then fso.moveFile FolderA & "\" & fileName, FolderB & "\" & fileName End If End If Next End Sub

  • エクセルに二つのテキストファイルをインポートしたい

    エクセルのsheet1の1行目にタイトルがあります。 ボタンのクリックイベントで、テキストファイル2つをインポートしたいのですが。 ・テキストファイルの名前は、固定ではありません ・テキストファイルの保存先は、デスクトップで、ファイルの選択は自分でしたい ・テキストファイルの一行目は、タイトル行なので、二行目以降をインポートしたい 行数は固定ではありません ・タブ区切りです 複数選択はできなく、1ファイルでタイトル行も含めるのであれば下記コードできたのですが。 どなたか、ご教示いただけますでしょうか・・・・ よろしくお願いいたします。 ----------------------------------------------------- Sub ReadTextFile() 'タブ区切りファイルを全て文字列として読み込む Dim FileName As String Dim i As Long Dim Cnt As Long Dim Buf As Variant Dim FileNo As Integer Dim SplitString As Variant 'ファイルダイアログを表示 FileName = Application.GetOpenFilename("テキストファイル,*.txt") If FileName <> "False" Then '全セル選択して書式を文字列にセットする Cells.Select Selection.NumberFormatLocal = "@" Cells(1, 6).Select '空いているファイル番号を取得 FileNo = FreeFile() Buf = Space(FileLen(FileName)) 'ファイルを開いてbufに1行読み込み ' → タブで配列に分割 ' → セルに書き出し Open FileName For Input As #FileNo Do Until EOF(FileNo) Line Input #FileNo, Buf Cnt = Cnt + 1 SplitString = Split(Buf, vbTab) For i = 0 To UBound(SplitString) Cells(Cnt, i + 1) = SplitString(i) Next i Loop Close #FileNo Else End If End Sub -----------------------------------------------------

  • VBA エクセル 文字列

    A列に、【鈴木 太郎】、【佐藤 一郎】・・・・と続いていて、B列には鈴木、佐藤・・・と表示させたい場合は以下のソースに、 =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) と同じソースを書けばいいのはわかるのですが、勉強不足でわかりません。教えていただけませんでしょうか。下記のソースも教えていただきました。すごく助かります。 Sub PickupWords() Dim Matches As Object Dim Match As Object Dim buf As String Dim c As Variant With CreateObject("VBScript.RegExp") .Pattern = "【(.+)】" .Global = False Application.ScreenUpdating = False For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp)) If .Test(c.Value) Then buf = c.Value Set Matches = .Execute(buf) c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す End If Next c Application.ScreenUpdating = True End With End Sub

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • 抜き出しマクロ(3)

    以下のプログラムは10行ごとにデータを抜き出すプログラムです。 これに追加して、普段は10行に1個データを抜き出し、前回の結果より絶対値が10増減があったとき、 相対値が10%の増減があった時にもデータを抜き出すようにするにはどうすればいいですか? 例えば以下の通り time result 1   1 2   1 3   1 4   1 5   1 6   1 7   1 8   1 9   1 10   1 11  100 12  500 13  1000 14  1000 15  1000 16  1000 17  1000 18  1000 19  1000 20  1000 21  1000 ・  ・ ・  ・ ・  ・  ↓ time result 1   1 10  1 11  100 12  500 13  1000 20  1000 ・  ・ ・  ・ ・  ・ ここからプログラム(10行ごとに抜き出す) ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Sub nukitori() Dim X As Worksheet Dim i As Long Dim ii As Long Dim col As Integer Dim Nukitori_Step As Long Nukitori_Step = 10 i = 2 ii = 2 '●●●見出し行が1行目なので2で始める Set X = ActiveSheet '●シートShordataがあったら削除 On Error Resume Next Application.DisplayAlerts = False Worksheets("shortdata").Delete Application.DisplayAlerts = True On Error GoTo 0 Worksheets.Add.Name = "shortdata" '●先ず、見出しをコピー Worksheets("shortdata").Rows(1).Value = X.Rows(1).Value While X.Cells(i, 1) <> "" And i < 65535 For col = 1 To 255 Worksheets("shortdata").Cells(ii, col).Value = X.Cells(i, col).Value Next If i = 2 Then i = 1 i = i + Nukitori_Step ii = ii + 1 Wend End Sub ここからプログラム(10行ごとに抜き出す+増減があった場合も抜き出す) ただし以下の箇所でエラーが起こる If i > 3 And Abs(Cells(i, 1) - Cells(i - 1)) >= 10 Then 中断モードでコードを実行することができませんと。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Sub 抽出() Dim i As Long Dim j As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim Lastline As Long Dim SelFlg As Boolean '抽出データかどうかの Set ws1 = Worksheets("OriginDT") '元データ Set ws2 = Worksheets("SelectDT") '抽出データ Lastline = ws1.Cells(Rows.Count, 1).End(xlUp).Row '最終行番号を取得 ws2.Cells(1, 1) = ws1.Cells(1, 1) '見出し部分のコピー ws2.Cells(1, 2) = ws1.Cells(1, 2) j = 1 For i = 2 To Lastline SelFlg = False '10で割ったあまりが1(つまり10行おき)または最初のデータのとき If i Mod 10 = 1 Or i = 2 Then ' SelFlg = True '抽出対象にする End If '2行目以降で一つ上の行との差が10以上のとき If i > 3 And Abs(Cells(i, 1) - Cells(i - 1)) >= 10 Then SelFlg = True '抽出対象にする End If If SelFlg = True Then '抽出対象だったらコピー j = j + 1 ws2.Cells(j, 1) = ws1.Cells(i, 1) ws2.Cells(j, 2) = ws1.Cells(i, 2) End If Next End Sub

  • vba ファイルの移動について

    フォルダAの中にあるたくさんのpdfファイルの中から、 ファイル名の頭文字3つがE列に記載した「aaa」だったら フォルダBに移動させるという内容にしたいです。 ネット検索などで、近いものを作成しましたが(下に貼り付け)、 下から4行目、「fso.moveFile FolderA & "\" & fileName, FolderB & "\" & fileName」で 「実行時エラー'53'  ファイルが見つかりません。」 とエラーが出てしまいます。 どの様に書き直せばよいのでしょうか? どなたかご存じでしたら、ぜひお教え下さい。 よろしくお願いします。 エクセル2010を使用しています。 Sub CheckAndMoveFiles() Dim FolderA As String Dim FolderB As String FolderA = Range("D1").Value FolderB = Range("B2").Value Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim ws As Worksheet Set ws = ActiveSheet Dim lastRow As Long lastRow = ws.Range("E" & Rows.Count).End(xlUp).Row Dim r As Long Dim fileName As String For r = 1 To lastRow If ws.Cells(r, "E").Value <> "" Then fileName = ws.Cells(r, "E").Value dFileName = Dir(FolderA & "\" & Left(fileName, 3) & "*.pdf") Do While dFileName <> "" dFileName = Dir() Loop fso.moveFile FolderA & "\" & fileName, FolderB & "\" & fileName 'ここでストップ End If Next End Sub

  • 変名が思うように処理されないのは ?

    現在、以下のようなコードでA列のファイル名に指定の不要文字が含まれる場合、削除して変名を行っています。 エラーは出ないのですが、同名チェックが想定と違うのか上手く処理できていません。 具体的には、 不要文字が無いのに(1)が追加されて変名される場合があります。 不具合の原因が判るでしょうか? Option Explicit Sub ファイル変更_部分削除() Dim Fso As Object 'FileSystemObject Dim Folder As Object 'Folder Dim File As Object 'File Dim FolderPath As String 'フォルダパス Dim Target As Variant '削除したい文字列 Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Target") Set ws2 = Worksheets("DEL") 'FileSystemObjectを作成 Set Fso = CreateObject("Scripting.FileSystemObject") 'フォルダパスを指定 FolderPath = "C:\Target\" 'Folderオブジェクトを取得 Set Folder = Fso.GetFolder(FolderPath) Worksheets("Target").Cells.Clear ws1.Range("A1") = "修正後のファイル名" ws1.Range("A1").Font.Bold = True ws1.Range("B1") = "拡張子" ws1.Range("B1").Font.Bold = True ws1.Range("C1") = "元ファイル名_退避" ws1.Range("C1").Font.Bold = True Dim ext As String Dim num As Long num = 2 For Each File In Folder.Files ext = Fso.getextensionname(File.Name) Select Case ext Case "ts", "mkv", "mp4" '元ファイル名及び同拡張子を出力 ws1.Cells(num, "A").Value = Fso.GetBaseName(File.Name) ws1.Cells(num, "B").Value = Fso.getextensionname(File.Name) num = num + 1 Case Else End Select Next Dim lc1 As Long, lc2 As Long lc1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row '最終行番号の取得 lc2 = ws2.Cells(Rows.Count, "B").End(xlUp).Row '元ファイル名を退避 ws1.Range(ws1.Cells(2, "A"), ws1.Cells(lc1, "A")).Copy ws1.Cells(2, "C").PasteSpecial ws1.Columns("A:C").AutoFit '-------------------------------------------------------- 'Replacedメソッド / ワイルドカードを使って置換() Dim DelMojis As String '指定文字列を格納する変数 Dim i As Long Dim Fix1 As String For i = 2 To lc2 With ws1 .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=Fix1, Replacement:="", LookAt:=xlPart End With Next For i = 2 To lc2 DelMojis = ws2.Cells(i, "B") '指定文字列を変数に代入 With ws1 .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=DelMojis, Replacement:="", LookAt:=xlPart End With Next '---------------------------------------- 'ファイル名変更 Dim OldName As String '元のファイル名 Dim NewName As String '新しいファイル名 For i = 2 To lc1 With ws1 OldName = FolderPath & .Cells(i, "C") & "." & .Cells(i, "B") NewName = FolderPath & .Cells(i, "A") & "." & .Cells(i, "B") End With With Fso 'fso=CreateObject("Scripting.FileSystemObject") '移動先に同名のファイルがあるかチェック If .FileExists(NewName) Then ' 同名がある場合は、NewNameの最後に(1)を追加する Dim k As Long k = InStrRev(NewName, ".") NewName = Left(NewName, k - 1) & "(1)" & Right(NewName, Len(NewName) - k + 1) .MoveFile OldName, NewName Else 'ファイルを移動 .MoveFile OldName, NewName End If End With '-------------------------- Next End Sub

  • マクロ HTMLタグのクラス名を入れたらエラー

    下記のプログラムはセルに文字を入れてHTML化するものです。 HTMLタグにクラス名を入れると「中断モードでコードを実行することはできません」とエラーメッセージが出ます。 LineData = "<div class=“sample”>” & ws.Cells(i, 1).Value & "</div>" & vbCrLf クラス名の「” ”」が問題だと思いますが、どうしたら良いでしょうか? 宜しくお願いします。 Sub convertHTML()  Dim ws As Worksheet  Dim htmlFile As String  Dim i As Long  Dim LineData As String    Set ws = ThisWorkbook.Worksheets(1)  htmlFile = ActiveWorkbook.Path & "\Sample.html"  Open htmlFile For Output As #1    i = 1  Do While ws.Cells(i, 1).Value <> ""   LineData = "<div id=“sample”>” & ws.Cells(i, 1).Value & "</div>" & vbCrLf   LineData = LineData & "<p>" & ws.Cells(i, 2).Value & "</p>" & vbCrLf   LineData = LineData & "<span>" & ws.Cells(i, 3).Value & "</span>" & vbCrLf   Print #1, LineData   i = i + 1  Loop  Close #1  MsgBox htmlFile & "に書き出しました" End Sub

専門家に質問してみよう