• 締切済み

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ファイルを検索して印刷したいのですが、 見よう見まねで作ってみたもののエラーが出てしまってよく分かりません。 指摘できるところご指導よろしくお願いします。

みんなの回答

回答No.2

If inbox = Cells(a, 1) Then  MsgBox ("あります")  Exit Do Else  a = a + 1 ElseIf Cells(a, 1) <> inbox Then←ここ  MsgBox ("ない") End If このElseIfが怒られてますね。(当然なんですけど^^;) で、この部分って何がしたいんですか? 指摘したいのですが、やりたい事がさっぱりわかりません。。。 該当部分を削っても無限ループになるみたいだし。。。 (PS。このdo~loopをコメントアウトすれば正常に印刷されました。印刷部は正常のようです。)

nana1010
質問者

補足

A列にあらかじめデータをいれといて、inputoboxでそのデータがあるか判断して、もしあったらPDFファイル(inputboxに入れたデータ名)を開き印刷し、もしなかった場合はinputobox(最初から)戻るってかたちにしたいのですが・・・ 説明不足ですいません。よろしくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> エラーが出てしまってよく分かりません。 どこ(何行目)で、どのようなエラーが発生するのか、を教えてください。

nana1010
質問者

補足

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"←ここのファイルの指定場所がいまいち分かりません A列にあらかじめデータをいれといて、inputoboxでそのデータがあるか判断して、もしあったらPDFファイル(inputboxに入れたデータ名)を開き印刷し、もしなかった場合はinputobox(最初から)戻るってかたちにしたいのですが・・・ファイルの指定場所もいまいち分からなくて困ってます。すいませんがよろしくお願いします。

関連するQ&A

  • 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

  • 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 部分の意味がわからないのですが教えてください。 ご指導よろしくお願いします

  • EXCEL VBAでApplication.waitを使わずに一時停止させたい

    マクロの実行中に、その処理を、条件分岐によってある一定時間だけ止めて、また再開させるようなプログラムを作りたいと考えています。 Application.Waitを使えば、可能というとこまではわかったのですが、それだとマクロ停止中にEXCEL上での一切の操作(たとえばスクロール)ができなくなるので、マクロだけ停止させておいて、他の操作はできるようなやり方はありませんでしょうか? ちなみに、当方の使用OSはXP、EXCELは2007です。VBAは、はじめて取り組む超初心者で、以下のコードもネットやこちらのサイトを探しまくって、ようやくここまでできました。 なお、本マクロで具体的にやりたいことは、楽天証券のRSSというアプリケーションから、EXCELの特定の列に、1行目から順番に、リアルタイムで株価が書き込まれていきます。その株価を監視して、ある一定以上になったら、音で知らせるということをやりたいのです。その際、株価が書き込まれていく間隔は、数秒~数分です。 長々と書きましたが、ご教授いただけると助かります。 <参考:現在のマクロ> Sub Test() Dim waitTime As Variant Dim 繰り返し As Long For 繰り返し = 1 To 10 If Cells(繰り返し, 1).Value >= 10000 Then Shell "mplay32.exe /play /close C:\WINDOWS\Media\notify.wav" ElseIf Cells(繰り返し, 1).Value = Empty Then waitTime = Now + TimeValue("0:00:05") Application.Wait waitTime End If Next 繰り返し End Sub

  • エクセル VBA 自動処理の途中終了について

    エクセルで単語のフラッシュカードを自動表示させたいと考えています。 エクセルの1セルの大きさを縦最大、横120位に広げ、C列に単語、D列に意味を縦に並べ、 C2 1秒後 D2 1秒後 C2 1秒後 D2 1秒後  C3 1秒後 D4 のように単語と意味を交互に2度ずつ表示させます。 For Next を使い表示はできるようになりましたが、途中で止めたいときに、escを押すと For Nextの処理を最後まで一気に行ってから止まってしまいます。 C5を表示していたら、その場所でPause をし、スタートボタンで再度継続して表示したいと思います。また、単語や意味のセルにはそれぞれ別の文字装飾をしてあるので、(赤や青、大きさなど) セルを移動して表示したいと考えています。 実は他のサイトでも質問しましたが、思ったような回答を得られませんでした。よろしくお願いします。 Sub セル移動() Dim waitTime As Variant i = 0 Range("c2").Select waitTime = Now + TimeValue("0:00:01") Application.Wait waitTime Range("c3").Select waitTime = Now + TimeValue("0:00:01") Application.Wait waitTime For i = 1 To 50 ActiveCell.Select Selection.Offset(0, 1).Select waitTime = Now + TimeValue("0:00:01") Application.Wait waitTime Selection.Offset(0, -1).Select waitTime = Now + TimeValue("0:00:01") Application.Wait waitTime Selection.Offset(0, 1).Select waitTime = Now + TimeValue("0:00:01") Application.Wait waitTime Selection.Offset(1, -1).Select waitTime = Now + TimeValue("0:00:01") Application.Wait waitTime Application.OnKey ("{esc}"), "shuryo" i = i + 1 Next i End Sub Sub shuryo() Application.ScreenUpdating = False Range("c2").Select Application.GoTo reference:=ActiveCell, scroll:=True Application.ScreenUpdating = True Exit Sub End Sub

  • エクセルVBAで重複入力の排除

    すでに入力規則はリストで使用しております。 そのためVBAで重複入力の排除を行おうと思います。 一応以下のコードでできたのですが、もっと良い方法があったら教えてください。 お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range)    Dim myDic As Object    Dim c As Variant, varData As Variant    Dim i As Long    If Application.Intersect(Target, Range("A1:A50")) Is Nothing Then Exit Sub    Set myDic = CreateObject("Scripting.Dictionary")    varData = Range("A1:A50").Value    For Each c In varData      If Not c = Empty Then        i = i + 1        If Not myDic.Exists(c) Then          myDic.Add c, Null        End If      End If    Next    If myDic.Count < i Then     MsgBox Target & " は重複!"     Application.EnableEvents = False     Application.Undo     Application.EnableEvents = True    End If End Sub

  • VBAでの「メソッドまたはデータメンバが見つかりま

    word2016で以下のプログラムを流したいのですが、「メソッドまたはデータメンバが見つかりません」のエラーが出ます。 Dim CB As Variant, i As Long CB = Application.ClipboardFormats If CB(1) = True Then MsgBox ”クリップボードになにも値がありません。”,48 Exit Sub End If どうすれば直るでしょうか?よろしくお願いします。

  • 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初心者です

    VBA初心者です。 同じセルに数字を入れて足し算して行きたいんですが! 下記のVBA見つけたのですが、A1に数字を入れて答えがE1に出るんですが、同じ事を A2、A3、A4、A5答えもE2、E3......で増やしたいのですが、どうするか分かりません。 どなたか教えてください。 宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim inp, outp As String inp = "$A$1" outp = "E1" Application.EnableEvents = False If Target.Address = inp Then Range(outp).Value = Range(outp).Value + Target.Value If Target.Value <> "" Then ActiveCell.Offset(-1, 0).Select Else Range(outp).Value = 0 End If End If Application.EnableEvents = True 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の形式も違います。 ご教授よろしくお願いします。

専門家に質問してみよう