質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

5904閲覧

Public変数が呼び出せない

kingkamehameha

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/02/04 04:11

#Publicで宣言した変数が別のプロシージャから呼び出せない

#エラー 変数が定義されていません。
呼び出したいのは、UniPageNです。支払通知書の分割で、ページ数が1枚目の時とそれ以降の時で読むタグを変更したいです。

VBA

1Option Explicit 2 3 4Sub mergePDF(stPg As Long, edPg As Long, wkAr() As String, wkctm As String, ExpFld As String) 5 Dim acObjUni As New Acrobat.AcroPDDoc '結合用に使うAcrobatオブジェクト 6 Dim acObjIns As New Acrobat.AcroPDDoc '追加用に使うAcrobatオブジェクト 7 Dim rsUni As Long '結合用PDF戻り値 8 Dim rsIns As Long '挿入用PDF戻り値 9 Dim i As Long 10 Dim wkInsFile As String 11 Public UniPageN As Long: UniPageN = 0 'ページ数 12 rsUni = acObjUni.Create() 13 Debug.Print ("rsUni:" & rsUni) 14 15' For i = stPg To (edPg - stPg) + 1 16 For i = stPg To edPg 17 18 wkInsFile = wkAr(0) & "\" & wkAr(i) 19 Debug.Print ("wkInsFile:" & wkInsFile) 20 rsIns = acObjIns.Open(wkInsFile) 21 Debug.Print ("rsIns:" & rsIns) 22 rsUni = acObjUni.InsertPages(UniPageN - 1, acObjIns, 0, 1, True) 23 Debug.Print ("rsUni:" & rsUni) 24' rsUni = acObjUni.InsertPages(UniPageN - 1, acObjIns, 0, 1, False) 25 rsIns = acObjIns.Close() 26 Debug.Print ("rsIns:" & rsIns) 27 28 UniPageN = UniPageN + 1 29 Debug.Print ("UniPageN:" & UniPageN) 30 31 Next 32 'PDFに名前を付けて保存 33 rsUni = acObjUni.Save(PDSaveFull, ExpFld & "\支払通知書_" & Trim(wkctm) & "_" & Format(Now(), "yyyymmddhhmmss") & ".pdf") 34 Debug.Print ("rsUni:" & rsUni) 35 rsUni = acObjUni.Close() 36 37 Set acObjUni = Nothing 38 Set acObjIns = Nothing 39 40End Sub 41 42 43Function xmlSCH(wkFileN As String) As String 44 45 Dim objXML As MSXML2.DOMDocument60 46' Dim pElem As MSHTML.HTMLParaElement 47' Dim e As MSHTML.HTMLHtmlElement 48 Dim rsLoad As Long 49 Dim SCH As Object 50 Dim prmXML As Long 51 Dim wkCusCD As String 52 Dim arMod() As Long 53 54 '初期設定 55 xmlSCH = "" 56 prmXML = 0 57 ReDim arMod(3) 58 59 Set objXML = New MSXML2.DOMDocument60 60 objXML.async = False 61 62 rsLoad = objXML.Load(wkFileN) 63 Debug.Print ("rsLoad:" & rsLoad) 64 65 If objXML.parseError.ErrorCode <> 0 Then 66 MsgBox "ロード失敗: Code " & objXML.parseError.ErrorCode & vbCrLf & vbCrLf & objXML.parseError.reason 67 Exit Function 68 End If 69 70 Debug.Print (UniPageN) 71 If UniPageN = 1 Then 72 '===========================1枚目の処理============================== 73 For Each SCH In objXML.getElementsByTagName("P") 'Pタグ列を処理 74 Debug.Print ("SCH.XML:" & SCH.XML) 75 If InStr(SCH.XML, "支払通知番号") > 0 Then 'SCH.XMLから"支払通知"があった場合はIf 76 prmXML = prmXML + 1 77 Debug.Print ("prmXML:" & prmXML) 78 79 'InStr(検索元, 検索ワード)見つからない場合:0,見つかった場合:1以上 80 arMod(0) = InStr(SCH.XML, "お客様コードNO:") + 13 'お客様コードが始まる位置 先頭から9文字目 81 Debug.Print ("arMod(0):" & arMod(0)) 82 arMod(1) = InStr(SCH.XML, "支払通知番号") 'お客様コードが終わる位置 支払い通番号から-0文字目 83 Debug.Print ("arMod(1):" & arMod(1)) 84 wkCusCD = Mid(SCH.XML, arMod(0), (arMod(1) - arMod(0))) 'Mid(String,start,[,length]) 85 Debug.Print ("wkCusCD:" & wkCusCD) 86 End If 87 Next 88 Else 89 '=======================2枚目以降の処理============================== 90 For Each SCH In objXML.getElementsByTagName("Table") 'thタグ列を処理したい" 91 Debug.Print ("SCH.XML:" & SCH.XML) 92 If InStr(SCH.XML, "お客様コードNO") > 0 Then 93 prmXML = prmXML + 1 94 Debug.Print ("prmXML:" & prmXML) 95 'InStr(検索元, 検索ワード)見つからない場合:0,見つかった場合:1以上 96 arMod(0) = Len(SCH.XML) '全文字数の取得 97 Debug.Print ("arMod(0):" & arMod(0)) 98 arMod(1) = InStr(SCH.XML, "お客様コードNO:") + 9 'お客様コードが始まる位置 先頭から9文字目 99 Debug.Print ("arMod(1):" & arMod(1)) 100 wkCusCD = Mid(SCH.XML, arMod(1), (arMod(0) - arMod(1))) 'Mid(String,start,[,length]) 101 Debug.Print ("wkCusCD:" & wkCusCD) 102 End If 103 Next 104 End If 105 106 107 xmlSCH = wkCusCD '現在の取引先CD 108 Debug.Print ("xmlSCH:" & xmlSCH) 109 Set objXML = Nothing 'Objectの開放 110 111End Function 112 113

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

パブリック変数は関数の外で宣言してください。
またmergePDFとxmlSCHが同じモジュールに存在しているのであれば、publicをつける必要はありません。

VBA

1Dim UniPageN As Long 'ページ数 2 3Sub mergePDF(stPg As Long, edPg As Long, wkAr() As String, wkctm As String, ExpFld As String) 4 Dim acObjUni As New Acrobat.AcroPDDoc '結合用に使うAcrobatオブジェクト 5 Dim acObjIns As New Acrobat.AcroPDDoc '追加用に使うAcrobatオブジェクト 6 Dim rsUni As Long '結合用PDF戻り値 7 Dim rsIns As Long '挿入用PDF戻り値 8 Dim i As Long 9 Dim wkInsFile As String 10 UniPageN = 0 'ページ数 11

投稿2020/02/04 04:36

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ExcelVBA

1private UniPageN As Long 2Sub mergePDF(stPg As Long, 3 UniPageN = 0 'ページ数

モジュールレベルで変数を適用したければ、
プロシージャの外で宣言してください。

【ExcelVBA入門】変数の適用範囲(Dim・Public)について徹底解説!
変数の適用範囲

投稿2020/02/04 04:34

編集2020/02/04 04:36
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問