• ベストアンサー

vba初心者

いつもお世話様です。 A列にあらかじめデータを入れといてinboxでデータを検索してもしあったらPDFファイルを開いて印刷でもしデータがなかったらinboxに戻るかたちにしたいんですけど、do...loopの使い方が分からないのと、デバックがでてしまってどう直せばいいかわかりません。サンプルコードがあれば助かります。よろしくお願いします。 Dim a As Integer Dim inbox As String Dim Localpath As Variant Dim c As Range, myFadd As String Dim flag As Variant Dim MyShell As Object Dim Mysh As String Dim newHour As Variant Dim newMinute As Variant Dim newSecond As Variant Dim waitTime As Variant Localpath = ThisWorkbook.Path a = 1 inbox = InputBox("番号") Do If inbox = Empty Then Exit Sub End If If inbox = Cells(a, 1) Then MsgBox ("あります") Exit Do Else a = a + 1 ←ここでデバックがでてしまいます。 ElseIf Cells(a, 1) <> inbox Then MsgBox ("ない") End If Loop Set MyShell = CreateObject("WScript.Shell") MyShell.Run ("AcroRd32.exe /n") MyShell.Run ("AcroRd32.exe /p") & Localpath & "\" & Myfile & ".pdf" newHour = Hour(Now()) newMinute = Minute(Now()) newSecond = Second(Now()) + 10 waitTime = TimeSerial(newHour, newMinute, newSecond) Application.Wait waitTime Application.SendKeys "{Enter}", True '次の使用例は、10 秒を過ぎるとメッセージを表示します。 If Application.Wait(Now + TimeValue("0:00:10")) Then MsgBox "時間が過ぎました。" End If End Sub

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.10

こんにちは。 以下を新規標準モジュールにコピペ Private Declare Sub Sleep Lib "kernel32" _     (ByVal dwMilliseconds As Long) Sub PrintPDF(ByVal FileName As String, _            Optional ByVal Copies As Long = 1)   Dim dtLimit As Date   Dim lngChannel As Long   Dim I As Long   Dim blnAlerts As Boolean   CreateObject("Wscript.Shell").Run "AcroRd32.exe", 7   dtLimit = Now() + TimeSerial(0, 0, 10) ' 起動待ちの制限時間   With Application     blnAlerts = .DisplayAlerts  'DisplayAlertsを元に戻す為に初期値を記憶     .DisplayAlerts = False   End With   On Error GoTo Err_Handler   lngChannel = DDEInitiate("Acroview", "Control")   On Error GoTo 0   Application.DisplayAlerts = blnAlerts   For I = 1 To Copies     DDEExecute lngChannel, _           "[FilePrintSilent(""" & FileName & """)]"   Next   DDEExecute lngChannel, "[AppExit]"   DDETerminate lngChannel   Exit Sub Err_Handler:   If Now() < dtLimit Then     Sleep 200     Resume   End If   Application.DisplayAlerts = blnAlerts   Err.Raise Err.Number, , "Adobe Readerとの通信を開始できません" End Sub さらに、こちらも(必ず上記コピペを先に行って下さい) Sub PDF_Menu()   Dim searchNo As Variant   Dim searchCount As Integer   Dim Localpath As Variant   Dim MyFile As String   Dim strFindRange As String      Localpath = ThisWorkbook.Path   Do     searchNo = _     StrConv(InputBox("番号は? N で終了します"), vbNarrow + vbUpperCase)     If searchNo = "N" Then Exit Sub     Do       searchCount = _       WorksheetFunction.CountIf(ActiveSheet.Range("A:A"), searchNo)              Select Case searchCount         Case 0           MsgBox "正しい番号を入力して下さい"           Exit Do '外側のループに移動         Case 1           strFindRange = _           ActiveSheet.Range("A:A"). _           Find(what:=searchNo, Lookat:=xlWhole).Address         Case Else           MsgBox "同じ番号が複数登録されています"           Exit Do       End Select              MyFile = Localpath & "\" & Range(strFindRange).Offset(0, 1) & ".pdf"              If Dir(MyFile) = "" Then         MsgBox MyFile & " が見つかりません" & vbCrLf _           & "実際にファイルが有るか確認して下さい"         Exit Do       End If              If MsgBox(Range(strFindRange).Offset(0, 1) _         & " を印刷しますか", vbOKCancel) = vbCancel Then         Exit Do       End If              PrintPDF (MyFile)       Exit Do     Loop   Loop End Sub Do ~ Loopから何かしらの脱出方法がないと無限地獄に落ちてしまうので、 N キーで抜け出す事にしました。 Acrobat の終了方法で確実なものが考えられなかったので PrintPDF は他所で発見したものを丸ごと使わせていただきました。 画面がちらつく(Reader がチラッと出てくる)のはご勘弁を。 WSH のヘルプに則っているのですが何としても出てきます。   CreateObject("Wscript.Shell").Run "AcroRd32.exe", 7 ←これ(7)の意味は   『ウィンドウを最小化ウィンドウとして表示します。アクティブなウィンドウは切り替わりません。』   という事になってるのですけどね?? WSHのヘルプはこちらからダウンロードできます http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=C717D943-7E4B-4622-86EB-95A22B832CAA VBAではできない事を色々補ってくれます。 http://wwwroy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/ad.mspx

nana1010
質問者

お礼

ありがとうございます。 一つ質問なのですが、 >PrintPDF は他所で発見したものを丸ごと使わせていただきました。 こうのようなvbaのサンプルコードはどのように探せばよろしいでしょうか? 何かアドバイスあったらください!よろしくお願いします。

その他の回答 (10)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.11

Excel関連やVisualBasic関連のHP、BBSを時間を作って(暇なとき)見る 使えそうなものはメモって置く 分からない言葉があったときに、ソフトのヘルプやGoogleで調べる Googleで関係しそうな単語を入れて検索  (DDE Excel VBA PDF ・・で検索したと思う)  何を入れたら Hit しやすいかは経験とある程度の知識の蓄積が必要。  書籍で系統立てた勉強はしておいた方が良いと思います  つまみ食いだと結局遠回りだと思います→俺 個人運営のHPでは相互にリンク紹介しているので、 そこから自分に合いそうな所を辿る。 具体的なサイトは、Excel関連では http://www.moug.net/index.htm http://www.h3.dion.ne.jp/~sakatsu/ http://www.fuji.ne.jp/~excelyou/exrounge.htm など綺羅星のごとくあります。 ちょっと道草 http://cgi30.plala.or.jp/chikada/vba/vba.shtml

nana1010
質問者

お礼

ありがとうございました! また機会がありましたら色々教えてくださいね!

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.9

えーと、少しきつい言い方をしてしまった事をお詫びいたします。 虫の居所が悪かったので、ムカッとなってしまいました。 さてと、 Do と Loop、If と End If、Select Case と End Select などは 必ずペアになっていないとエラーになりますがあってます? Do・・ If・・ Select・・を複数使用した場合に、 必ずしもエラーが正しいメッセージを出すわけでは有りません。 End If が欠けているのに Select・・が無いといってくる場合もあります。 多分やられているとは思いますが、No3 の時の回答のように、Tab キーで インデント(文字送り)してあると見やすくなります。 ただ、此処の掲示板は行頭のTab や 半角Spaceを無視してしまうので困ったモンです。 No3は投稿用に全角スペースに変換して行っています。 Acrobat Reader ver8 との事ですので、確認をちょっとお願いしたいのですが MyShell.Run ("AcroRd32.exe /p ") & ・・・を MyShell.Run ("AcroRd32.exe /T ") & ・・・とした場合は 印刷後にAcrobatは自動的に閉じますか? その場合はAcrobatの終了処理が不要になりますので・・

nana1010
質問者

お礼

遅くなってすいません。 こちらこそ勉強不足と理解不足でイライラさせてしまってすいませんでした。 Do と Loop、If と End If、Select Case と End Select などは 必ずペアになっていないといけないことは分かるのですが、特にDo と Loopの場合はどこにDoを入れればいいか分からないのです。 Do searchNo = InputBox("番号") If searchNo = "" Then Exit Sub searchCount = WorksheetFunction.CountIf(ActiveSheet.Range("A:A"), searchNo) Select Case searchCount Case 0 MsgBox searchNo & "が見つかりません" Case 1 strFindRange = _ ActiveSheet.Range("A:A").Find(what:=searchNo, Lookat:=xlWhole).Address MyFile = Range(strFindRange).Offset(0, 1) If MsgBox(MyFile & " を印刷しますか", vbOKCancel) = vbOK Then Exit Do End If Case Else MsgBox searchNo & "が登録されてません" End Select Loop (全角のやり方が分かりませんでした) >Acrobat Reader ver8 との事ですので、確認をちょっとお願いしたいのですが MyShell.Run ("AcroRd32.exe /p ") & ・・・を MyShell.Run ("AcroRd32.exe /T ") & ・・・とした場合は 印刷後にAcrobatは自動的に閉じますか? のことなのですが、Acrobatは自動的に閉じませんでした。 もう一つあるのですが、 Do searchNo = InputBox("番号") If searchNo = "" Then Exit Sub ←ここの部分 searchCount = WorksheetFunction.CountIf(ActiveSheet.Range("A:A"), searchNo) Select Case searchCount の矢印の部分なのですが、”空白”だった場合 “Exit Sub” になっていますがまた “searchNo = InputBox("番号")” の部分に戻る事はできないのでしょうか? 宜しくお願いします。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.8

だからぁ・・・。今、 かなりイライラしています。 MyShell.Run ("AcroRd32.exe /p ") & Localpath & "\" & MyFile & ".pdf", 1 で開こうとして > このファイルが見つかりません となっているのでしょ?ということは、 ファイルが存在しないか、あるいはファイルのPathの渡し方に問題がある・・ またはフォルダをおいてある場所・・ もしくはPath名に解釈できない部分がある・・ と考えるのが自然でしょ? なので > では、開きたいPDFファイルは何処においているのですか? と尋ねている訳です。 XLSファイルと同じフォルダ・・では話がまったく見えません! > ファイル名= c:\documents and settings\nicotinism\my documents\例の.pdf > などと出力されているはずですが? ↑                    ↑ 前レスでこのように例示していても分かりませんか? http://www.h2.dion.ne.jp/~naknak/debug.htm OS や Excel のバージョンが異なると、モジュールの実行結果が異なることは 決して珍しいことではありません。 何かを開発しようとする場合に必ず抑えておかなくてはならない部分です。 先のレスでもAcrobatReader 6.x では印刷されないが、同 7.x では印刷されます。 という問題がありましたよね? 回答する場合は極力汎用性のあるものを提示したいのですが、 これは中々難しいものがあります。 ですので、私も無駄にスレを伸ばしたくないので、「バージョンは何ですか?」と尋ねています。 という事で、前回のレスで尋ねたことに加えて 一度問題を整理したいので、現在のモジュールをコピペして提示してください。

nana1010
質問者

お礼

遅くなってすいません。 すいませんが補足のほうに入れてしまいました。

nana1010
質問者

補足

遅くなってすいません。 OS 名 Microsoft Windows XP Home Edition バージョン 5.1.2600 Service Pack 2 ビルド 2600 (excel2003) です。ほとんどnicotinismさんのコードを使わせてもらいました。すいません。実をいうと最初自分で作ったコードも色んなサイトから拾って使ってみたものなのです。 ちょっと変えてみたのですが、このコードでpdfファイルは開けるようになりました。 原因は変数のMyFailでした MyFailは MyFile = Range(strFindRange).Offset(0, 1) だったのでinputboxはいったデータ(ファイル名)ではないので、ファイルが開かなかったのです。 なのでMyShell.Run ("AcroRd32.exe /p ") & Localpath & "\" & searchNo & ".pdf", 1 にしてみました。 そしたら開きました。 そこであらたにコードを付け加えてみたのですが今度は"doに対するloopがありません"となってしまいました。 どうしてでしょうか?空はだったらまたinputboxに戻りたいんですけど・・・ 色々お聞きしたいことまだあるのですが、よろしいでしょうか? 何卒よろしくお願いします。 Dim searchNo As Variant Dim searchCount As Integer Dim Localpath As String Dim MyShell As Object Dim MyFile As String Dim strTrgRange As String Dim strFindRange As String Dim newHour As Variant Dim newMinute As Variant Dim newSecond As Variant Dim waitTime As Variant Localpath = ThisWorkbook.Path Do searchNo = InputBox("番号") If searchNo = Empty Then MsgBox "空白です" Else Exit Do End If 'Do searchCount = WorksheetFunction.CountIf(ActiveSheet.Range("A:A"), searchNo) Select Case searchCount Case 0 MsgBox searchNo & "が見つかりません" Case 1 strFindRange = _ ActiveSheet.Range("A:A").Find(what:=searchNo, Lookat:=xlWhole).Address MyFile = Range(strFindRange).Offset(0, 1) If MsgBox(MyFile & " を印刷しますか", vbOKCancel) = vbOK Then Exit Do End If Case Else MsgBox searchNo & "が登録されていません" Loop Set MyShell = CreateObject("WScript.Shell") MyShell.Run ("AcroRd32.exe /p ") & Localpath & "\" & searchNo & ".pdf", 1 End Sub

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.7

では、開きたいPDFファイルは何処においているのですか? > debug.print "ファイル名= " & Localpath & "\" & MyFile & ".pdf" これでAcrobatReaderがファイルを開こうとする前の段階で イミディエイト ウィンドウに ファイル名= c:\documents and settings\nicotinism\my documents\例の.pdf などと出力されているはずですが? イミディエイト ウィンドウは Ctrl + G でも開きます。 (分からない言葉は自身でもヘルプで調べてね!) OSのバージョンはマイコンピュータを右クリックしてプロパティから表示されます Excelのバージョンはヘルプからバージョン情報で。 ちょっと前途多難かな・・・

nana1010
質問者

お礼

イミディエイト ウィンドウに" 実行時エラー'424': オブジェクトが必要です"と表示されます。 開きたいpdfファイルはマクロを実行しているファイルと同じフォルダの中にあります。 >OSのバージョンはマイコンピュータを右クリックしてプロパティから表示されます Excelのバージョンはヘルプからバージョン情報で。 って何かvbaと関係しているのですか?

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.6

では早速前レスを参考にして 前略 Loop debug.print "ファイル名= " & Localpath & "\" & MyFile & ".pdf" '←これを追加 Set MyShell = CreateObject("WScript.Shell") MyShell.Run ("AcroRd32.exe /p ") & Localpath & "\" & MyFile & ".pdf", 1 後略 でイミディエイト ウィンドウ に何が表示されますか? 多分・・・と、山勘は働いていますけど一応。 > ActiveWindow.caption ↑これは、Excel の『ActiveWindow』なので、AcrobatReader は「我関せず」です。 Windows のバージョン(XP ならHome Or Proも含めて)と、ServicePackのバージョン? Excel のバージョン と SPのバージョン? 以上三点は如何? 週末には決着したいと思っています。 なのでお礼欄に記述してもらうと、こちらに無条件でメールが入りますので 反応も早いかと思います。

nana1010
質問者

お礼

わかりました。お礼欄に記述しますね! debug.print "ファイル名= " & Localpath & "\" & MyFile & ".pdf" これを追加しましたが、やはり”この文章の開くときにエラーが発生しました。このファイルが見つかりません”とでてしまいます。 >Windows のバージョン(XP ならHome Or Proも含めて)と、ServicePackのバージョン? Excel のバージョン と SPのバージョン? の意味がちょっと分からないのですが・・・

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.5

どうやって?と言われても答えに窮してしまいますが 取りあえずは いきなり書き始めないで、紙に流れ(アルゴリズム)を書いて考える。 ヘルプを見てみる。 Do や Loop などの所にカーソルを持って行って、F1 キーで出てきます。 ループに入る前のラインで F9 キーでブレークポイントを置いておくと そこで止まりますので、F8キーでステップ実行して追いかける。 debug.print 変数名 でイミディエイトウィンドウに現れた値で確認する とかでしょうか・・ なお MyShell.Run ("AcroRd32.exe /p ") & Localpath & "\" & MyFile & ".pdf", 1 を MyShell.Run ("AcroRd32.exe /t ") & Localpath & "\" & MyFile & ".pdf", 1 とすると 当方で確認した限りではAcobatReader7.xでは印刷まで自動的に行われるようです 6.xでは印刷されませんでした。 印刷終了後にAcrobatReader を自動的に閉じる方法で確実なものが分かりません 印刷の途中で紙切れやトナー切れで他のプリンタをデフォルトプリンタに切り替えた場合 エラーになっているプリンタのジョブをどう処理するか?などなど・・・

nana1010
質問者

補足

ありがとうございます。 今AcobatReader8.xを使ってるのですが、AcobatReader8.までは開くのですが"この文章を開くときのエラーが見つかりました。このファイルが見つかりません”ってなってしまうのですが、どうしてでしょうか? それとAcrobatReader を自動的に閉じる方法って"ActiveWindow.Close"ではだめなのでしょうか?よろしくお願いします。

回答No.4

こんにちは。 if文の一般的な使い方を説明します。 (1). a = 1 の時は b = a + 1 を実行する  if a = 1 then   b = a + 1  end if (2). a = 1 の時は b = a + 1, 左記以外は b = a - 1 を実行  if a = 1 then   b = a + 1  else   b = a - 1  end if (3). a = 1 の時は b = a + 1, a = 2 の時は b = a * 2,    左記以外は b = a - 1 を実行  if a = 1 then   b = a + 1  elseif a = 2 then   b = a * 2  else   b = a - 1  end if (4). a = 1 の時は b = a + 1, a = 2 の時は b = a * 2 を実行  if a = 1 then   b = a + 1  elseif a = 2 then   b = a * 2  end if となります。 ・if~endifはペアで用いる(endifが最初のif文の終わり) ・elseは先行するif(またはelseif)がすべて偽の時実行される ・elseは最後の条件判定文(ない場合もあります)

nana1010
質問者

お礼

ありがとうございます! 応用してやってみたいと思います。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

前半だけです。(^^ゞ 後半はきっちりやろうとすると難し~。APIかWMIの出番? (B列にファイル名があると仮定してます) Sub PDF_Print() Dim searchNo As Variant Dim searchCount As Integer Dim Localpath As String Dim MyShell As Object Dim MyFile As String Dim strTrgRange As String Dim strFindRange As String Dim newHour As Variant Dim newMinute As Variant Dim newSecond As Variant Dim waitTime As Variant Localpath = ThisWorkbook.Path Do   searchNo = InputBox("番号")   If searchNo = "" Then Exit Sub   searchCount = WorksheetFunction.CountIf(ActiveSheet.Range("A:A"), searchNo)   Select Case searchCount     Case 0       MsgBox searchNo & "が見つかりません"     Case 1       strFindRange = _       ActiveSheet.Range("A:A").Find(what:=searchNo, Lookat:=xlWhole).Address       MyFile = Range(strFindRange).Offset(0, 1)       If MsgBox(MyFile & " を印刷しますか", vbOKCancel) = vbOK Then         Exit Do       End If     Case Else       MsgBox "同じ番号 " & searchNo & "が複数登録されています"   End Select Loop Set MyShell = CreateObject("WScript.Shell") MyShell.Run ("AcroRd32.exe /p ") & Localpath & "\" & MyFile & ".pdf", 1 End Sub

nana1010
質問者

補足

ありがとうございます。 完璧すぎるご回答感謝致します!!! 構文まで作っていただいてありがとうございました。 本当に助かりました。 do...loopの間の構文の作り方ってどうやってどうやって作っていけばいいですか?おおまかの流れは分かるのですが、一つ一つになると理解が欠けてしまいます。よろしかったら細かくなってしまうと思うのですがご指導よろしくお願いします。

回答No.2

ifの構造がおかしいです。 if inbox ..  else   a=a+1  elseif end if else の後ろに elseif があります。

nana1010
質問者

補足

Else a = a + 1  Cells(a, 1) <> inbox Then ←ここでデバックがでてしまいました。 MsgBox ("ない") End If このようにしてみたのですが、またデバックがでてきてしまいました。 elseとelseifをどこで使ったらいいかわかりません。教えて下さい。宜しくお願いします。

  • PIC-JQ
  • ベストアンサー率18% (42/222)
回答No.1

a = a + 1 ←ここでデバックがでてしまいます。 ElseIf Cells(a, 1) <> inbox Then 次のようにしたらどうですか? a = a + 1 ELse If Cells(a, 1) <> inbox Then

関連するQ&A

  • vba 初心者

    Dim a As Integer Dim inbox As String Dim Localpath As Variant Dim c As Range, myFadd As String Dim flag As Variant Dim MyShell As Object Dim Mysh As String Dim newHour As Variant Dim newMinute As Variant Dim newSecond As Variant Dim waitTime As Variant Localpath = ThisWorkbook.Path a = 1 inbox = InputBox("番号") Do If inbox = Empty Then Exit Sub End If If inbox = Cells(a, 1) Then MsgBox ("あります") Exit Do Else a = a + 1 ElseIf Cells(a, 1) <> inbox Then MsgBox ("ない") End If Loop Set MyShell = CreateObject("WScript.Shell") MyShell.Run ("AcroRd32.exe /n") MyShell.Run ("AcroRd32.exe /p") & Localpath & "\" & Myfile & ".pdf" newHour = Hour(Now()) newMinute = Minute(Now()) newSecond = Second(Now()) + 10 waitTime = TimeSerial(newHour, newMinute, newSecond) Application.Wait waitTime Application.SendKeys "{Enter}", True '次の使用例は、10 秒を過ぎるとメッセージを表示します。 If Application.Wait(Now + TimeValue("0:00:10")) Then MsgBox "時間が過ぎました。" End If End Sub ExcelからPDFファイルを検索して印刷したいのですが、 見よう見まねで作ってみたもののエラーが出てしまってよく分かりません。 指摘できるところご指導よろしくお願いします。

  • vba 初心者

    いつもお世話様です。 vbaを始めたばっかりで、色々な情報をもらったのですが、 まだ理解に苦しんでいるところがあります。 Private Declare Sub Sleep Lib "kernel32" _ (ByVal dwMilliseconds As Long) Sub PrintPDF(ByVal FileName As String, _ Optional ByVal Copies As Long = 1) Dim dtLimit As Date Dim lngChannel As Long Dim I As Long Dim blnAlerts As Boolean CreateObject("Wscript.Shell").Run "AcroRd32.exe", 7 dtLimit = Now() + TimeSerial(0, 0, 10) ' 起動待ちの制限時間 With Application blnAlerts = .DisplayAlerts 'DisplayAlertsを元に戻す為に初期値を記憶 .DisplayAlerts = False End With On Error GoTo Err_Handler lngChannel = DDEInitiate("Acroview", "Control") On Error GoTo 0 Application.DisplayAlerts = blnAlerts For I = 1 To Copies DDEExecute lngChannel, _ "[FilePrintSilent(""" & FileName & """)]" Next DDEExecute lngChannel, "[AppExit]" DDETerminate lngChannel Exit Sub Err_Handler: If Now() < dtLimit Then Sleep 200 Resume End If Application.DisplayAlerts = blnAlerts Err.Raise Err.Number, , "Adobe Readerとの通信を開始できません" End Sub Dim searchNo As Variant Dim searchCount As Integer Dim Localpath As Variant Dim MyFile As String Dim strFindRange As String Localpath = ThisWorkbook.Path Do searchNo = _ StrConv(InputBox("図番を入力してください"), vbNarrow + vbUpperCase) 'Strconv=大文字・半角 If searchNo = "EXIT" Then Exit Sub Do searchCount = _ WorksheetFunction.CountIf(ActiveSheet.Range("A:A"), searchNo) Select Case searchCount ←(2) Case 0 MsgBox "正しい番号を入力して下さい" Exit Do '外側のループに移動 Case 1 strFindRange = _ ActiveSheet.Range("A:A"). _ Find(what:=searchNo, Lookat:=xlWhole).Address ←(4) Case Else MsgBox "同じ番号が複数登録されています" Exit Do End Select MyFile = Localpath & "\" & searchNo & Range(strFindRange).Offset(0, 1) & ".pdf" If Dir(MyFile) = "" Then MsgBox MyFile & " が見つかりません" & vbCrLf _ & "実際にファイルが有るか確認して下さい" Exit Do End If If MsgBox(Range(strFindRange).Offset(0, 1) _ & " を印刷しますか", vbOKCancel) = vbCancel Then Exit Do End If PrintPDF (MyFile) Exit Do Loop Loop End Sub (1)ここの部分で、空白かキャンセルボタンをしたら StrConv(InputBox("図番を入力してください"), vbNarrow + vbUpperCase)に戻りたいのですが、この場合どこにexit do を入れたいか分かりません。 (2)データが入っているフォルダ内に複数あるならそれを分岐にする方法ってありませんか? (3)ここのRange(strFindRange).Offset(0, 1) は必要があるのでしょうか? (4)Find(what:=searchNo, Lookat:=xlWhole).Address 部分の意味がわからないのですが教えてください。 ご指導よろしくお願いします

  • 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

  • VBAのタイマー

    こんにちは VBAで、一日に一回起動するマクロを作ろうと思っています。 Sub timer() Dim settime As Variant Dim waittime As Variant settime = TimeValue("00:35:00") '指定時刻 waittime = TimeValue("00:01:00") settime = settime + waittime '指定時刻待ち時間 Application.OnTime TimeValue(settime), "sub" End Sub な感じなのですが、これだと一度起動すると二日目以降は動作しなくなります。 毎日起動するにはどうしたら良いものでしょうか

  • 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

  • ExcelのVBAでブックを保存

    住所録Aと住所録Bがあります。 AとBを比較して、差異をを別ファイルに出力しようとしています。 比較元となるファイルは、AでもBでもかまいません。 比較、判定、ファイルへの出力部分は、省略していますが、保存 する場合は、どこに行うのがよいのですか bookですか。sheetですか。 両方で、SaveAsができまが、使い分けがあるのでしょうか。 どのように使い分けするのでしょうか。 書き方、使い方のおかしいところを指摘して頂くとありがたい です。 --------------------------------------------------------------------------------------------------- Option Explicit Sub test() Dim ret As Integer Dim row1 As Long Dim col1 As Long Dim row2 As Long Dim col2 As Long Dim myRtn As Boolean Dim fno1 As String Dim fno2 As String Dim OutBook As New Workbook Dim OutSheet As New Worksheet Dim OutFileName As String Dim cnt As Integer Dim I As Integer ret = MsgBox("処理を開始します。" + Chr(13) + Chr(10) + "よろしいですか。?", _ vbYesNo + vbQuestion) If ret = vbNo Then End End If myRtn = Application.Dialogs(xlDialogOpen).Show If myRtn = False Then MsgBox "[キャンセル]が選択されました" & vbCr & _ "処理を終了します" Exit Sub End If fno1 = Application.ActiveWorkbook.Name myRtn = Application.Dialogs(xlDialogOpen).Show If myRtn = False Then MsgBox "[キャンセル]が選択されました" & vbCr & _ "処理を終了します" Exit Sub End If fno2 = Application.ActiveWorkbook.Name Set OutBook = Workbooks.Add Set OutSheet = ActiveSheet OutBook.Worksheets(1).Name = "テスト" OutFileName = "テスト.xls" With Application.Workbooks(fno1).Worksheets(1) row1 = 1 col1 = 1 cnt = 1 Do While .Cells(row1, 1) <> "" 処理 (省略) Loop End With MsgBox "処理が終了しました。", vbOKOnly + vbInformation, "確認" Application.Workbooks(fno1).Close Application.Workbooks(fno2).Close OutSheet.SaveAs Filename:=OutFileName OutBook.SaveAs Filename:=OutFileName OutBook.Close End Sub --------------------------------------------------------------------------------------------------- OutSheet.SaveAs Filename:=OutFileName or OutBook.SaveAs Filename:=OutFileName のどちらでも保存ができます。 また、書き方、使い方のおかしいところを指摘して頂くとありがたいです。

  • AccessのVBAに関しての質問です。

    クエリで抽出したファイルをCSVで出力させ、出力したファイル名を「連番&ファイル名」の形にしたく 下記のコードを使用しました。 6ファイルは出力は成功したのですが、7ファイル目を出力しようとしたところ、「#6:オーバーフロウしました。」とエラーがでてきてしまいます。 原因やここのコードを変えれば直るというのが、お分かりになる方がいればご教示頂けますでしょうか。 初心者ですのでコードも書いて頂けると非常に助かります。 Private Sub コマンド4_Click() On Error GoTo ErrorTrap Dim varAccess As Variant Dim varCPass As Variant Dim strmsg As String varAccess = "ASN抽出" Dim FolderPass As String Dim FileName As String Dim CheckCount As Integer FolderPass = "C:¥Users¥エクスポート¥" FileName = "_STORE_ASN_TRN.csv" CheckCount = 0 Do Until Dir(FolderPass & FileName) = "" CheckCount = CheckCount + 1 FileName = Format(CheckCount, Len(CStr(CheckCount)) + 1) & "_STORE_ASN_TRN" & ".csv" Loop varTextPass = FolderPass & FileName strmsg = "csvファイルへ出力します。" & Chr(13) & _ "出力先は" & varTextPass & "です。" & _ "よろしければ、OKをクリックして下さい。" If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferText acExportDelim, , varAccess, varTextPass, False MsgBox "データ出力は、正常に完了しました。" End If Exit Sub ErrorTrap: If Err.Number = 3044 Then ' MsgBox "パス指定が誤っています。", vbCritical Else MsgBox "予期せぬエラーが発生しました。(#" & Err.Number & " : " & Err.Description & ")", vbCritical End If End Sub

  • エクセルのマクロを利用して

    マクロ初心者でです。 いろんなサイトから引用させて頂き次のようなマクロを作成しました。 実行すると、日付と担当者氏名(A1)がファイル名となるものです。 そこで教えて頂きたいのですが、実行すると保存先がマイドキュメントに なるのですが、これを例えば「C:\日報」というフォルダが指定されるようにしたいのですが、 自分なりに、いろいろ試したのですが全くできません。 宜しくお願い致します。 Sub 名前をつけて保存() Dim SaveFileName As String, re As Variant With Sheets("sheet1").Range("A1") If .Value = "" Then MsgBox "名前が入力されていません", vbExclamation Exit Sub Else SaveFileName = Format(Now, "yyyymmdd") & "_" & .Value End If End With re = Application.GetSaveAsFilename(SaveFileName) If re = False Then MsgBox "保存を中止しました", vbExclamation Else MsgBox "日報をを保存しました", vbInformation End If End Sub

  • Excel VBA ループについて

    Excel VBA勉強中の者です。 シート名「一覧」のA列に入力されている「1」を検索し、メッセージボックスに表示させています。 現在、「1」はA3、A5、A7に入力されています。 下記のコードだとA3、A5、A7がメッセージボックスで表示された後、もう一度A3が表示されてしまいます。 A7が表示された時点で終わりにしたいのですが、どこを修正すればいいのでしょうか? Sub test() Dim xRange As Range Dim fPlace As String Dim i As Integer Dim xMoji As String xMoji = 1 Set xRange = Worksheets("一覧").Range("A1:A100").Find(What:=xMoji) If Not xRange Is Nothing Then fPlace = xRange.Address Msgbox xRange.Address Do   Set xRange = Worksheets("一覧").Range("A1:A100").FindNext(After:=xRange) If Not xRange Is Nothing Then   Msgbox xRange.Address End If Loop Until fPlace = xRange.Address End If End Sub よろしくお願いします。

  • 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

専門家に質問してみよう