• ベストアンサー

VBAにてアクティブでは無いシートの値が参照されてしまいます。

こんばんは、以前二回程質問させていただいた物です。 過去のアドバイスから少しずつ疑問をつぶしていった所再び問題が発生してしまいました。 同じプログラムを何度も載せるのは大変恐縮ですが、どうしても解決出来ない為(私の努力不足は重々承知です)皆様の力を貸して頂きたいと思います。 以下のようなループの際、途中にMsgBox(strFILENAME)を入れたり、Active.sheetでウオッチ式で見ても参照してほしいシート名を表示するにも関わらず、計算結果を書き込むシートのセルを参照してしまいます。 なぜ、WS1のセルの値を参照してしまうのかわからず困っています。 確実にMsgBox(strFILENAME)で表示されるファイル名のシートのセルを参照する方法を教えて頂きたく、よろしくお願いいたします。(Workbook.Worksheet.のように明示する方法を教えていただいたのですがエラーが発生してしまいうまく使いこなすことが出来ませんでした) どうか、宜しくお願いいたします。 Option Explicit Sub syoutotumen() Dim i As Long Dim j As Long Dim k As Long Dim kyori As Long Dim n As Integer n = 1 i = 1 j = 1 k = 1 Const cnsYEN = "\" Dim swESC As Boolean Dim ws1 As Worksheet Dim xlAPP As Application Dim objWBK As Workbook Dim strPATHNAME As String Dim strFILENAME As String strPATHNAME = "C:\Documents and Settings\tata41\デスクトップ\画像処理2\" If strPATHNAME = "" Then Exit Sub strFILENAME = Dir(strPATHNAME & "demo******", vbNormal) If strFILENAME = "" Then MsgBox "このフォルダにはExcelワークブックは存在しません" Exit Sub End If Set xlAPP = Application With xlAPP .ScreenUpdating = False .EnableEvents = False .EnableCancelKey = xlErrorHandler .Cursor = xlWait End With Set ws1 = Worksheets("sheet1") Range("A1") = "0" Range("A2") = "1" Range("A1:A2").Select Selection.AutoFill Destination:=Range("A1:A1022") Do While strFILENAME <> "" DoEvents If swESC = True Then If MsgBox("ESCが押されました。ここで終了しますか?", vbInformation + vbYesNo) = vbYes Then GoTo Button1_Click_Exit Else swESC = False End If End If xlAPP.StatusBar = strFILENAME & "処理中・・・" Set objWBK = Workbooks.Open(Filename:=strPATHNAME & cnsYEN & strFILENAME, UpdateLinks:=False, ReadOnly:=True) Do If Cells(i, 2) = 0 Then Exit Do i = i + 1 Loop Do If Cells(j, 3) = 0 Then Exit Do j = j + 1 Loop Do If Cells(k, 4) = 0 Then Exit Do k = k + 1 Loop kyori = (i + j + k - 21) / 3 ws1.Cells(n, 2) = kyori n = n + 1 i = 1 j = 1 k = 1 objWBK.Close savechanges:=False strFILENAME = Dir Loop GoTo Button1_Click_Exit Button1_Click_ESC: If Err.Number = 18 Then swESC = True Resume ElseIf Err.Number = 1004 Then Resume Next Else MsgBox Err.Description End If Button1_Click_Exit: With xlAPP .StatusBar = False .ScreenUpdating = True .EnableEvents = True .EnableCancelKey = xlInterrupt .Cursur = xlDefault Set objWBK = Nothing Set xlAPP = Nothing End With End Sub

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

huhuhuhuiさんこんばんは 苦戦していますね。 こちらの環境(EXEL2000)で確認する限りでは、そのままでも一応、動作しているようですが・・・ 開いたワークブック上で0が入力されている行番号を調べ、それから計算した結果をws1のB列に記入してくれます。 ので、残念ながら明確に問題点は、指摘できません。 ちと疑問なのは、最初にws1に指定しているのが、アクティブブックのSheet1なのですが、その後でA列に「0、1、2・・・」書き込んでいるのはアクティブシートが対象になっています。 マクロの実行するブックもシートが1枚(Sheet1のみ)ならば、結局は同じシートになりますが、複数ある場合は、Sheet1以外からマクロを実行すると、「0、1、2・・・」を書き込むシートと結果を書き込むシートが別物になってしまいます。 ここでも、できるだけシートを明示しておいた方が良いですね。(将来のために) <例>  Range("A1") = "0" → ws1.Range("A1") = "0" さて、開いたブックでのシートの指定の方法ですが、各ブックで開くシート名がみな同じならば「シート名」で指定すればよいですが、そうとも限らないでしょうから、シートが1枚しかないことを利用して・・・  If Cells(i, 2) = 0 Then Exit Do    → objWBK.Worksheets(1).Cells(i, 2) = 0 Then Exit Do のような指定方法でいかがでしょうか? (上の記述方法はシート名でなく、一番目のシートという指定方法です) (objWBKにはopenメソッドで開いたブックが代入されています) ただし、こちらの環境では動作していますので、これを指定したから動くと言うものでもないかも・・・

huhuhuhui
質問者

お礼

こんにちは! 開いたブックのシートの指定方法を試したところうまくいきました!! 前回に続き詳しく解説して頂きありがとうございました! 本当にありがとうございました!

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 個々のテクニックは、ご自身が書いたものではないのかもしれませんが、コードには無理があるように思います。コードとしては、テクニックの寄せ集めのようです。どこを直したらようというようなレベルのコードではないように思います。応急措置は、親オブジェクトの指定をすればよいのですが、それぞれのテクニックには適材適所があります。それを無視しても意味がなくなります。もう、これ以上は、全体的に書き直したほうがよいと思います。たぶん、Dir でCSVファイルを読み取って計算をさせる初歩的な内容なのに、コードは複雑にしすぎているように思います。 >Set xlAPP = Application >With xlAPP これは、オートメーション・オブジェクトではないのですから、VBE内では無意味です。 > .EnableCancelKey = xlErrorHandler   ↓ >If swESC = True Then >If MsgBox("ESCが押されました。ここで終了しますか?", vbInformation + vbYesNo) = vbYes Then ここは、ESC Key に対する ErrorHandler のトラップが抜けていませんか? そもそも、ユーザーオプションでマクロを止めるような必要性があるのか分かりませんし、CSVファイルがの処理が長引くようなら、最初から、ファイル数をカウントして、離脱させたほうがよいです。 それに、#3さんでご指摘にありますが、 >strFILENAME = Dir(strPATHNAME & "demo******", vbNormal) .csv の拡張子ないなら、そのフォルダにあるものをすべて拾うことになり、エラーの発生が高くなります。 >Range("A1") = "0" >Range("A2") = "1" >Range("A1:A2").Select >Selection.AutoFill Destination:=Range("A1:A1022") これは、 With Range("A1:A1022")   .FormulaLocal = "=ROW()-1"   .Value = Range("A1:A1022").Value End With のほうが自然です。AutoFill メソッドはあくまでも、ワークシートのテクニックです。 文字列の数字をCell に入力しても、型のキャスティングが働いて、数値に変わってしまいます。 >Set objWBK = Workbooks.Open(Filename:=strPATHNAME & cnsYEN & strFILENAME, _ UpdateLinks:=False, ReadOnly:=True) 単に、objWBK に入れるだけでなく、objWBK.Worksheets(1) などして > Do > If Cells(i, 2) = 0 Then Exit Do > i = i + 1 > Loop Cells の親オブジェクトの指定をしたほうがよいです。 >Button1_Click_ESC: >If Err.Number = 18 Then > swESC = True > Resume >ElseIf Err.Number = 1004 Then > Resume Next > Else > MsgBox Err.Description > End If Esc で、Resume, '1004'で、Resume Next では、無理があります。 '1004( というのは、ワークシート側からのエラーですから、それは回復できないことが多いので、Resume Next で戻しても役に立たないことが多いです。エラートラップは、そのエラーがわかっていれば、Resume Next で戻れますが、1004では、復旧出来ません。それを次に渡してもあまり意味がないように思います。そのResume Nextにはっきりした確信があるなら、別ですが、エラーが特定できるなら、On Error Resume Next ~ On Error Goto 0 ではさむことですね。

huhuhuhui
質問者

お礼

こんにちは。 このプログラムは仰る通りで、昔誰かが作ったものをベースとしているため、私自身が作ったものではありません。(私自身、VBAの存在をしったのも触ったのもつい最近のことです・・・) マクロを止める必要はないのでいらない部分は削除しAutofillメソッドの部分も代えさせて頂きました。 どうやら無意味なコードが多いようなので改善します! 本当にありがとうございました。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

No.1です。 あぁ、CSVを開くんですね。でしたらシート名はファイル名から「.csv」を取ったものになりますが、あえて指定する必要は有りませんね。 少しコードを読んでみました。 開くファイルは「demo…」で始まる事だけが条件ですが、CSVファイル以外は無いのですか?もし、他のファイルもあるのでしたら "demo******" ↓ "demo*.csv" と、した方がよろしいかと。 また、『計算結果を書き込むシートのセルを参照してしまいます』との事ですが、少なくともそのような動きをしているようには思えません。 ブレイクポイントを設定して1行づつコードを実行してみましたか? ブレイクポイントは、コードの左にある灰色の帯をクリックすると設定できます。 最初の n = 1 の左にブレイクポイントを設定するとコードを最初から確認できます。 この状態でマクロを動かすとブレイクポイントを設定した箇所でマクロが一時停止します。変数にカーソルを合わせれば変数の値を確認することが出来ます。 先に進めるにはF8です。一回押すと1ステップ進みます。

huhuhuhui
質問者

お礼

回答ありがとうございます! csvファイル以外はありません。 皆さまの助言により解決することができました。 F8により進めてみたりはしましたが、ブレイクポイントは使ってませんでした・・ ともあれ、本当にありがとうございました!

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

あまりちゃんとコードは読んでいませんが、参照して欲しいシートを明示的に指定すればよいのでは? If Cells(i, 2) = 0 Then Exit Do ↓ If Sheets("シート名").Cells(i, 2) = 0 Then Exit Do 2~4列目に初めて0が入っている行を調べる為だけにループを回すのもどうかと思います。ループを回さなくても、ワークシート関数で0の位置が取得できますよ。 2列目の場合: i = Application.WorksheetFunction.Match(0, Range("シート名!B:B"), 0)

huhuhuhui
質問者

お礼

補足ではなくお礼のほうに書くべきでした!! 補足にも目を通して頂けると幸いです。

huhuhuhui
質問者

補足

お早い回答ありがとうございます。 さっそく試してみましたが『シート名』の部分に何と記述すればよいかわかりません。(strFILENAMEやdemo00001などを記入してみました)demo00001.CSV~demo01022.CSVを次々に参照したいのですが、何を記述すればよい教えて頂くことは出来ないでしょうか? よろしくお願いいたします。

関連するQ&A

  • VBA実行時のエラー

    下記のプログラムは私が作った物では無いのですが、作った方と連絡をとる事が出来なくなってしまった為、質問させて頂きます。 このプログラムをシートから実行した所 エラー:400『既にフォームは表示されています。モーダルにできません。』 なるものが表示されてしまいます。 またコードを記述する所から実行しますと 実行時エラー:1004『アプリケーション定義またはオブジェクト定義のエラー』 となってしまいます。 私の努力が足りないのは重々承知ですが、解決する事が出来ません。 皆様のお力を借りることが出来たらと思い投稿しました。 宜しくお願い致します。 Sub syoutotumen() Dim i As Long Dim j As Long Dim k As Long Dim kyori As Long Dim n As Integer n = 1 i = 1 j = 1 k = 1 Const cnsYEN = "\" Dim xlAPP As Application Dim objWBK As Workbook Dim strPATHNAME As String Dim strFILENAME As String strPATHNAME = "C:\Documents and Settings\tata41\デスクトップ\画像処理\" If strPATHNAME = "" Then Exit Sub strFILENAME = Dir(strPATHNAME & "dem******", vbNormal) If strFILENAME = "" Then MsgBox "このフォルダにはExcelワークブックは存在しません" Exit Sub End If Set xlAPP = Application With xlAPP .ScreenUpdating = False .EnableEvents = Fales .EnableCancelKey = xlErrorHandler .Cursor = xlWait End With Set WS1 = Worksheets("sheet1") Range("A1") = "0" Range("A2") = "1" Range("A1:A2").Select Selection.AutoFill Destinaton:=Range("A1:A512") Do While strFILENAME <> "" DoEvents If swESC = True Then If MsgBox("ESCが押されました。ここで終了しますか?", vbInformation + vbYesNo) = vbYes Then GoTo Button1_Click_Exit Else swESC = False End If End If xlAPP.StatusBar = trFILENAME & "処理中..." Set objWBK = Workbooks.Open(Filename:=strPATHNAME & cnsYEN & strFILENAME, UpdateLinks:=False, ReadOnly:=True) Do If Cells(i, 2) = 255 Then Exit Do i = i + 1 Loop Do If Cells(j, 3) = 255 Then Exit Do j = j + 1 Loop Do If Cells(k, 4) = 255 Then Exit Do k = k + 1 Loop kyori = (i + j + k - 21) / 3 WS1.Cells(n, 2) = kyori n = n + 1 i = 1 j = 1 k = 1 objWBK.Close savechanges:=False strFILENAME = Dir Loop GoTo Button1_Click_Exit Button1_Click_ESC: If Err.Number = 18 Then swESC = True Resume ElseIf Err.Number = 1004 Then Resume Next Else MsgBox Err.Description End If Button1_Click_Exit: With xlAPP .StatusBar = False .ScreenUpdating = True .EnableEvents = True .EnableCancelKey = xlInterrupt .Cursur = xlDefault Set objWBK = Nothing Set xlAPP = Nothing End With End Sub

  • VBA フォルダ内の全てブックの特定の行の削除方法

    VBAで質問させて下さい。 指定したフォルダ内にある全てのブックにて、セル「B35」が0だった場合、その行を削除する というコードが上手く動きません。 出来ない箇所:行の削除、処理済みのブックを閉じる 色々と検索しましたが分からなかったので、ご教授頂けると大変助かります。 どうぞよろしくお願いいたします。 ----------------------ここから↓----------------- Sub 修正() Dim xlAPP As Application Dim strPathName As String Dim strFileName As String Dim swESC As Boolean ' 「フォルダの参照」よりフォルダ名の取得 strPathName = BrowseForFolder("フォルダを指定して下さい", True) If strPathName = "" Then Exit Sub ' 指定フォルダ内のExcelワークブックのファイル名を参照する strFileName = Dir(strPathName & "\*.xls", vbNormal) If strFileName = "" Then MsgBox "このフォルダにはExcelワークブックは存在しません。" Exit Sub End If Set xlAPP = Application With xlAPP .ScreenUpdating = False ' 画面描画停止 .EnableEvents = False ' イベント動作停止 .EnableCancelKey = xlErrorHandler ' Escキーでエラートラップする .Cursor = xlWait ' カーソルを砂時計にする End With On Error GoTo Button1_Click_ESC ' 指定フォルダの全Excelワークブックについて繰り返す Do While strFileName <> "" ' Escキー打鍵判定 DoEvents If swESC = True Then ' 中断するのかをメッセージで確認 If MsgBox("中断キーが押されました。ここで終了しますか?", _ vbInformation + vbYesNo) = vbYes Then GoTo Button1_Click_EXIT Else swESC = False End If End If '----------------------------------------------------------------------- ' 検索した1ファイル単位の処理 Call OneWorkbookProc(xlAPP, strPathName, strFileName) '----------------------------------------------------------------------- ' 次のファイル名を参照 strFileName = Dir Loop GoTo Button1_Click_EXIT '---------------- ' Escキー脱出用行ラベル Button1_Click_ESC: If Err.Number = 18 Then ' EscキーでのエラーRaise swESC = True Resume ElseIf Err.Number = 1004 Then ' 隠しシートや印刷対象なしの実行時エラーは無視 Resume Next Else ' その他のエラーはメッセージ表示後終了 MsgBox Err.Description End If '---------------- ' 処理終了 Button1_Click_EXIT: With xlAPP .StatusBar = False ' ステータスバーを復帰 .EnableEvents = True ' イベント動作再開 .EnableCancelKey = xlInterrupt ' Escキー動作を戻す .Cursor = xlDefault ' カーソルをデフォルトにする .ScreenUpdating = True ' 画面描画再開 End With Set xlAPP = Nothing End Sub '******************************************************************************* ' 1つのワークブックの処理 '******************************************************************************* Private Sub OneWorkbookProc(xlAPP As Application, _ strPathName As String, _ strFileName As String) Dim R As Range '--------------------------------------------------------------------------- Dim objWBK As Workbook ' ワークブックObject ' ステータスバーに処理ファイル名を表示 xlAPP.StatusBar = strFileName & "修正中...." ' ワークブックを開く Set objWBK = Workbooks.Open(Filename:=strPathName & cnsYEN & strFileName, _ UpdateLinks:=True, _ ReadOnly:=False) '--------------------------------------------------------------------------- ' ↓↓↓ 検索した1ファイル単位の処理 ↓↓↓ Set R = ActiveSheet.Range("B35").Find(What:="0", LookAt:=xlWhole) If R Is Nothing Then Exit Sub R.EntireRow.Delete ' ↑↑↑ 検索した1ファイル単位の処理 ↑↑↑ '--------------------------------------------------------------------------- ' 開いたブックをClose objWBK.Close SaveChanges:=True Set objWBK = Nothing End Sub

  • VBAの初心者でやりたいことがあるのですが、どうやっていいのか分かりま

    VBAの初心者でやりたいことがあるのですが、どうやっていいのか分かりません。 やりたいことは 1.フォルダを指定してCSVファイルを読み込む。 2.読み込んだCSVファイルを一行あたり1ファイルのエクセルファイルに書き込む。 3.完成したエクセルファイルを印刷する。 4.フォルダの中のファイルが無くなれば終了 としたいのですが、途中で頓挫しています。 宜しくお願いします。 Option Explicit sub READ_TextFile() Const cnsTITLE = "フォルダ内のファイル名一覧取得" Const cnsDIR = "\*.*" Dim xlAPP As Application Dim strPATHNAME As String Dim strFILENAME As String Dim GYO As Long Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP2 As Application' Applicationオブジェクト Dim intFF As Integer' FreeFile値 Dim X() As Variant' 読み込んだレコード内容 Dim IX1 As Long' CSV項目カラムINDEX Dim lngREC As Long' レコード件数カウンタ Dim strREC As String' レコード領域 Dim POS1 As Long' レコード文字位置 Dim POS2 As Long' レコード文字位置 Set xlAPP = Application strPATHNAME = xlAPP.InputBox("フォルダ名を入力して下さい。", _ cnsTITLE, "C:\Documents and Settings\hidekazu_miyawaki\デスクトップ\") If StrConv(strPATHNAME, vbUpperCase) = "FALSE" Then Exit Sub If Dir(strPATHNAME, vbDirectory) = "" Then MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTITLE Exit Sub End If strFILENAME = Dir(strPATHNAME & cnsDIR, vbNormal) Set xlAPP2 = Application Do While strFILENAME <> "" GYO = GYO + 1 Cells(GYO, 1).Value = strFILENAME strFILENAME = Dir() Open strFILENAME For Input As #intFF GYO = 1 Do Until EOF(intFF) lngREC = lngREC + 1 xlAPP2.StatusBar = "読み込み中です(" & lngREC & "レコード目)" Line Input #intFF, strREC POS1 = 1 IX1 = 0 ReDim X(IX1) Do While POS1 <= Len(strREC) POS2 = InStr(POS1, strREC, ",", vbTextCompare) If POS2 < POS1 Then POS2 = Len(strREC) + 1 End If ReDim Preserve X(IX1) X(IX1) = Trim$(Mid$(strREC, POS1, POS2 - POS1)) If (((Left$(X(IX1), 1) = """") And (Right$(X(IX1), 1) = """")) Or _ ((Left$(X(IX1), 1) = "'") And (Right$(X(IX1), 1) = "'"))) Then X(IX1) = Trim$(Mid$(X(IX1), 2, Len(X(IX1)) - 2)) End If POS1 = POS2 + 1 IX1 = IX1 + 1 Loop GYO = GYO + 1 If IX1 >= 1 Then Range(Cells(GYO, 1), Cells(GYO, IX1)).Value = X End If Loop Loop Close #intFF xlAPP.StatusBar = False MsgBox "ファイル読み込みが完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • xlAPPがないと、キャンセルしても無視される

    Sub xlAPPがある場合() Dim xlAPP As Application Dim strPathName As String, vntPathName As Variant Dim strFileName As String Set xlAPP = Application 'ここでわざとESCキーかキャンセルを押す vntPathName = xlAPP.InputBox("参照するフォルダ名を入力して下さい。", , "C:\") If VarType(vntPathName) = vbBoolean Then MsgBox "キャンセルがクリックされました" Exit Sub End If End Sub Sub xlAPPがない場合() Dim strPathName As String, vntPathName As Variant Dim strFileName As String 'ここでわざとESCキーかキャンセルを押す vntPathName = InputBox("参照するフォルダ名を入力して下さい。", , "C:\")      ’無視される If VarType(vntPathName) = vbBoolean Then MsgBox "キャンセルがクリックされました" Exit Sub End If End Sub ************************************************** InputBoxを開いた時にキャンセルするふたつのプロシージャーを比較した時に、 xlAPPがないコードは、キャンセルしても無視されます。 xlAPPがどんな役割をしているのか、 xlAPPがないと、なぜ無視されるのかがわかりません。 あと、二つを比較すると、表示されるInputBoxの形式も違います。 ご教授よろしくお願いします。

  • VBA:カウンターの i の値が開放されなくて困っています。

    以下のコードを実行する度に、カウンター i の値がリセット(開放)されずに積算されて困っています。なぜか教えて下さい。宜しくお願い致します。 以下のコードは、簡単に言えばcsvファイルをカウンター i で数えています。したがって、少なくともCSVファイルを一つ作成して実行して下さい。 Option Explicit Dim FiName As String, FoName As String Dim EachFiName As String Dim i As Integer Sub Test() MsgBox i '二回目にこのコードを実行するとiが積算されます。 FiName = Application.GetOpenFilename If FiName = "False" Then Exit Sub Else If Right(FiName, 3) <> "csv" Then MsgBox "Chose a CSV file." Exit Sub End If End If FoName = Left(FiName, InStrRev(FiName, "\", -1, vbTextCompare)) EachFiName = Dir(FoName & "*.csv") Do While EachFiName <> "" i = i + 1 EachFiName = Dir() Loop End Sub

  • 以下のVBAについて

    Option Compare Database Option Explicit Private Sub バックアップ開始_Click() Dim strBaseName As String Dim strFileName As String If IsNull(Me.バックアップ日付) = True Or Len(Me.バックアップ日付) = 0 Then MsgBox "バックアップ日付をyyyymmdd形式で入力してください。", vbOKOnly + vbCritical, "" Me.バックアップ日付.SetFocus Exit Sub End If strBaseName = "C:\Data\在庫管理.mdb" strFileName = "C:\Backup\" & Format(Me.日付, "yyyymmdd") & "StockData.mdb" If Dir(strFileName) <> "" Then If MsgBox(strFileName & Chr(13) & "は存在します。" & Chr(13) & _ "上書しますか?", vbYesNo + vbQuestion, "") = vbNo Then Exit Sub End If End If On Error GoTo LBL_ERROR FileCopy strBaseName, strFileName MsgBox "バックアップが完了しました。", vbInformation, "" LBL_EXIT: Exit Sub LBL_ERROR: Resume LBL_EXIT End Sub 上記のVBAでバックアップを行いたいのですが、フォルダ等も設定しているの実行されません。上記の文に間違いがあるのでしょうか? ソフトはAccessです。

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • エクセル VBA バッチが動かない。

    以下のVBAを試行錯誤の末(未熟なもので・・) 作ってみました。 デスクトップ上のフォルダを確認にて、存在する場合はそのままバッチ実行、 存在しない場合はフォルダを作成してバッチ実行。 というものなのですが、フォルダが存在する場合はすんなり行くのですが、 存在しない場合、フォルダを作成した後、バッチ処理がされなくて 困っています。どこが悪いのでしょうか? 是非ご教授お願いいたします。 ちなみにバッチはXCOPYです。 Sub SET_Original() Dim strPATHNAME As String strPATHNAME = "C:\Documents and Settings\ユーザー\デスクトップ\フォルダ" If StrConv(strPATHNAME, vbUpperCase) = "FALSE" Then Exit Sub If Dir(strPATHNAME, vbDirectory) = "" Then MsgBox "フォルダは作成します。", vbExclamation MkDir "C:\Documents and Settings\ユーザー\デスクトップ\フォルダ" Exit Sub End If Dim str As Variant str = Shell("c:\Documents and Settings\ユーザー\デスクトップ\copy.bat") End Sub

  • 複数のエクセルシートをまとめるマクロ

    下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub

  • VBAでのテキストデータ追記

    VBAを使ってデータをテキストファイルに追記したいのですが、 A列だけじゃなく A列からF列までのデータを追記させたいと 考えているのですが、 どうやるのか理解できません。 教えていただけますでしょうか? -------------------------------------------------------------- Option Explicit ' テキストファイル書き出すサンプル Sub WRITE_TextFile() Const cnsTitle = "テキストファイル出力処理" Const cnsFilter = "テキストファイル (*.txt;*.dat),*.txt;*.dat" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「名前を付けて保存」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "出力するファイル名を指定して下さい。" ' (1) vntFileName = xlAPP.GetSaveAsFilename(InitialFilename:="SAMPLE.txt", _ FileFilter:=cnsFilter, _ Title:=cnsTitle) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す) With ActiveSheet If .FilterMode Then .ShowAllData ' オートフィルタ解除 End With GYOMAX = Cells(65536, 1).End(xlUp).Row ' (2) If GYOMAX < 2 Then xlAPP.StatusBar = False MsgBox "テキストをA列2行目から入力してから起動して下さい。", , cnsTitle Exit Sub End If ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open strFileName For Output As #intFF ' (3) ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' (4) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)" ' レコードを出力 Print #intFF, strREC ' (5) ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル出力が完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTitle End Sub -----------------------------------------------------------------------------

専門家に質問してみよう