• 締切済み

VBをVBAに ソースコードあり

二度ほど こちらを利用させていただき、一歩ずつ理解してきているのですが、回りにVB、VBAを使っている方がいなく、相談出来る所がここしかなく また投稿させて頂きました 今回 迷っている事は VBのソースコードがあり それをVBAで実行する場合、どこで宣言すればいいのか という事です VBの~ソースコード~ メインふぉーむ データ受信関数 Private Sub RF720CLib_RFIDMessage(ByVal Message As String, ByVal MessageSize As Long) Dim code As String Dim cmd As String Dim body As String code = RF720CLib.GetResponseCode(Message, MessageSize) cmd = RF720CLib.GetCmdCode(Message, MessageSize) body = RF720CLib.GetResponseBody(Message, MessageSize) If code = "00" Then If cmd = "RD" Then For cnt = 0 To csvline - 1 If Vegetable(cnt).m_ID = body Then End If Next End If If cmd = "IS" Then ReadStep = ReadStep + 1 End If End If End Sub ↑ こちらで RF720CLib ライブラリーを使い  RD リードなどを行ってるとは思うのですが VBAの場合 フォームをロード時に イベントとして宣言すればいいのでしょうか? それとも 上記のはVBですので VBAで使う場合 また新しく作り変えなければいけないのでしょうか? VBとVBAは全く違うもの として考えた方がいいのでしょうか RF720CLibは アクティブXコントロールでVBAでも使えました とても 困っております 宜しくお願いします

  • _K_
  • お礼率50% (4/8)

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

VBAで開発不可といったこともありえると思います 実際には使用可能だが 開発元では十分な検証を行っていないような場合『使えますよ』といった明快な回答ではない場合もありえるでしょう ライブラリーが ActiveXコントロールならフォームに貼り付けるだけで参照設定もされます

  • s-suzuki
  • ベストアンサー率50% (3/6)
回答No.2

あまりわからないですが、一応回答してみます。 問題のコードはPrivate Subなので、このプロシージャを呼び出している部分が、VBのメインフォーム?のどこかにあるはずです。 その呼び出しを行っているのが、VBのメインフォームのMainプロシージャにあるなら、この問題のコードは起動時に呼び出されるべきものなので、アプリケーション起動時のイベントに書いてもいいでしょう。 ですが・・・。 VBとVBAは、内部関数が若干違うものの、基本的には同じものです。 なので、このPrivate Subプロシージャは、そのままコピーして、VBAに貼り付けるのが一番でしょう。 (Privateなので、これを呼び出しているコードがあるモジュールと同じモジュールに書きます) この問題のプロシージャが書いてあるVBのモジュールをよくみて、Private宣言の変数があれば、それもコピーします。 あとは、これを呼び出している部分を見つけて、それをどこに書くかです。 VBのMainプロシージャに書いてある場合は、VBAの起動イベントが起こる部分に書きましょう。 <VBとVBA間の移植の場合に気をつけること> (1)起動時の処理を書く場所が違う (2)VBA特有の内部関数(Excelでしか使えない関数・Accessでしか使えない関数)をどう処理するか (3)タイマーイベントが書かれてあるところを見落としてないか あと、参照設定も忘れずにしておきましょう。 雑な回答ですみません。

_K_
質問者

お礼

アプリケーション起動時のイベントは どちらで宣言すればいいのでしょうか? フォームロード時 フォームOPEN時とかで イベントとして 記入するのでしょうか? 全くの無知で申し訳ありません 移植で気をつける事 大変わかりやすく ありがとうございます VBで タイマーイベントも書いてあったのですが そちらは そのまま移植でも平気でしょうか? http://qanda.rakuten.ne.jp/qa3523237.html また指摘があり ソースコードの全般を乗せました もし宜しければ アドバイスお願いいたします

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

VBもVBAも基本的な部分は同じです VBAは その名のとおり Applicationに特化したオブジェクトやメソッドがあります たとえば Excel.VBAでしたら Applicationオブジェクトは Excel自身の参照ですし CellsやRangeといった ワークシート関連のオブジェクトや関数などが利用できます VBのFormに似た機能もUserFormとして組み込まれています # 完全に一致はしていませんが … ライブラリRF720CLibを提供しているところに VBAで動作可能なのか聞くといった事がまず先決だろうと思います 動作保障しないが これこれの手順で使用は可能です といった返答が期待することが出来ます また、そのライブラリのライセンスがどのようなものなのかも確認しましょう 開発者に対してのライセンスなのか、特定のパソコンに対するライセンスなのかといったことです 『会社にあるから使ってもいい』『友達から借りてきたからOK』 などはライセンス違反になる可能性があります ライブラリの提供形態がActiveX系なら ツール > 参照設定などで使える可能性があります ですが これは 先のライセンス項目などをクリアした上で行いましょう 提供もとの情報などを投稿すると より具体的な回答が付くと思いますよ また ご自身の開発環境も明記したほうが良いでしょう

_K_
質問者

お礼

提供先に さきほど メールを出し返答待ちですが VBで対応していて VBAで否対応という事もあるのでしょうか? ライブラリに関しては 開発用ライブラリという事で平気だとは思うのですが ライブラリを インストールし ActibeXでフォームに貼り付け コードを書き込むだけでなく 参照設定なども必要なのでしょうか? そちらは 全くしていなかったので 場所指定などもしてみます また情報を具体的にという事だったので ソースや開発環境など 書き込み 新しく投稿しました もしお時間がありましたら アドバイスお願いします http://qanda.rakuten.ne.jp/qa3523237.html

関連するQ&A

  • VB2005で、Structureの配列を返すプログラムを以下のように書きたい

    VB2005で、Structureの配列を返すプログラムを以下のように書きたいのですが、そもそもVB6しか使ったことが無いもので、以下のような素数の結果を返すこのプログラムの書き方はVB2005らしいでしょうか? Module Module1 Public Structure SosuuStatus Public num As Integer Public status As String End Structure Class Sosuu Function SosuuCheck(ByVal st As Integer, ByVal ed As Integer) As SosuuStatus() Dim i As Integer, j As Integer Dim sosuu(0 To ed - st) As SosuuStatus Dim cnt As Integer = 0 For i = st To ed sosuu(cnt).num = i sosuu(cnt).status = "" '初期化 If 1 = i Then sosuu(cnt).status = "素数ではない" ElseIf 0 = (i Mod 2) Then sosuu(cnt).status = "素数ではない" Else For j = 3 To Math.Sqrt(ed) If 0 = (i / j) Then sosuu(cnt).status = "素数ではない" End If Next j End If If sosuu(cnt).status = "" Then sosuu(cnt).status = "素数である" End If cnt = cnt + 1 Next i SosuuCheck = sosuu End Function End Class End Module

  • VB.NETの正規表現をVBAで記述するには

    VB2010.NETのコードをExcel2010のVBAのコードに置き換える作業をしていますが、List1のようにVB.NETのコードには、Inports System.Text.RegularExpressions で.NET正規表現パッケージが使われて、この部分をVBAではどのように記述すればよいのでしょうか。 自分なりにList2のようにしてみましたが、Dim M As MatchのMatchの部分で「ユーザ定義型は定義されていません」というコンパイルエラーが発生します。 参照設定にはSystem.Text.RegularExpressionsが見当たりませんが何を指定すればよいのでしょうか。 Microsoft VBScript Regular Expressions 5.5のRegExpオブジェクトでは後読みができないので大変困っています。 よろしくお願いします。(Windows7) ---List1:VB.NET(正常)--------------- Option Explicit On Option Strict On Imports System.Text.RegularExpressions Module Module1  Sub Main()   Dim SampleText As String = "今日は西暦2014年6月20日です"   Dim M As Match = Regex.Match(SampleText, "(?<=西暦)\d+")   If Not M.Success Then    Console.WriteLine("no match")   Else    Dim MatchedText As String = M.Value    Dim MatchedFrom As Integer = M.Index    Dim MatchedLen As Integer = M.Length    MsgBox("matched [" & MatchedText & "]" & _        " from char#" & MatchedFrom.ToString() & _        " for " & MatchedLen.ToString() & " chars.")   End If  End Sub End Module ---List2:VBA(このコードではエラーになる)----- Option Explicit Sub test()  Dim SampleText As String  Dim M As Match  Dim R As New Regex  Dim MatchedText As String  Dim MatchedFrom As Integer  Dim MatchedLen As Integer  SampleText = "今日は西暦2014年6月20日です"  R = Regex("(?<=西暦)\d+")  M = R.Match(SampleText)  If Not M.Success Then   MsgBox ("no match")  Else   MatchedText = M.Value   MatchedFrom = M.Index   MatchedLen = M.Length   MsgBox("matched [" & MatchedText & "]" & _       " from char#" & MatchedFrom.ToString() & _       " for " & MatchedLen.ToString() & " chars.")  End If End Sub ------------------------------------------

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

  • ExcelのVBAソースコード(一部)の翻訳

    ソースコードの一部ですが、開発者が他界し訊けずにおります。 今後自分でもVBAを勉強しますが、お教えいただけますでしょうか。 なお冒頭は Function process_new(m0 As Integer, m As Integer, d As Variant, ans As Double) As Integer Dim a(501), b(501), s(501), r(501) As Double Dim w(501), g(11), xx As Double Dim s1 As Double Dim k(501) As Integer Dim i, j, flg As Integer でスタートしています。 =(以下、質問内容)==== s1 = s(k(0)) * 1.618 flg = 0 For i = m0 To m - 3 If Not i = k(0) Then If s1 > s(i) Then flg = flg + 1 End If End If Next i =(以上)====

  • VBA 選択された離れたセルの値の取得について

    EXCELのVBAでどうしても前に進めず困っております。 目的としているコードは、離れたセル(複数)をあらかじめCtrlキーで選択状態にしておき、選択されたセルの値のみをVBAが別のセルに並べていくというものです。 以下が私の作ったコードなのですが、思ったとおりの動作をしてくれません。 VBA初心者なもので、おかしな記述がたくさんあると思うのですが、どなたかアドバイスお願いします。 Public Sub xx() Dim SelectArea As String Dim TargetCell As Range Dim a As Integer Dim Row As Integer Dim Column As Integer Dim CNT1 As Integer a = 0 Row = 0 Column = 0 For CNT1 = 1 To 10 Row = Row + 1 SelectArea = Selection.Address Set TargetCell = Range("B3").Cells(Row - 1, Column) If Intersect(Range(SelectArea), TargetCell) Is Nothing Then Else Range("A30").Cells(a, 0) = Range("B3").Cells(Row - 1, Column).Value a = a + 1 End If Next End Sub

  • VBAのコードについて

    VBA初心者でございます。 以下のコードの後半(End If以降)でエラーがでてしまいます。 非常に乱暴な質問で大変恐れ入りますが、コードで気になる点などございますでしょうか? もしございましたら、ご教示頂けますと幸いです。 どうぞ宜しくお願いいたします。 Sub 絞り込み() Dim i As Long Dim grp As String Dim newBookName As String Dim newBookPath As String Dim newBook As Workbook For i = 2 To 4 grp = Workbooks("test_master").Worksheets("grpリスト").Cells(i, 2) newBookName = Workbooks("test_master").Worksheets("grpリスト").Cells(i, 2) & ".xlsx" newBookPath = ThisWorkbook.Path & "\" & newBookName '指定したパスにファイルが作成済でないかを確認。 If Dir(newBookPath) = "" Then '新しいファイルを作成 Set newBook = Workbooks.Add '新しいファイルをVBAを実行したファイルと同じフォルダ保存 newBook.SaveAs newBookPath Else '既に同名のファイルが存在する場合はメッセージを表示 MsgBox "既に" & newBookName & "というファイルは存在します。" End If Workbooks("test_master").Worksheets("マスタ0701").AutoFilterMode = False With Workbooks("test_master").Worksheets("マスタ0701").Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).copy Workbooks(grp).Worksheets("Sheet1").Range("A1") '.AutoFilter End With Next i End Sub

  • VBA・VB6.0・VB.NETの文字列型

     失礼します。  Excel97/2000のVBAの文字列型変数は、アスキーコード129-159/224-252のデータを保持できないみたいですが、これはVB6.0/VB.NETなどでもそうなのですか?  つまり、VBAでは、 Sub main()  Dim s as String  s = Chr$(130)  Sheet1.Cells(1, 1) = Asc(s) End Sub  とすると、シートのA1に「0」が表示されてしまうということです。  というのも、私はVB6.0/VB.NETを持っていないのですが、ちょっとVB2.0時代のコードを使う必要が生じたので、VBAで実行してみたところ、以上のような仕様の違いに気付いたのです。  これがVBAだけの特性なのか、最近のVBはこういう仕様になってしまったのかが知りたいのです。

  • Access VBAで行ラベルが定義されていないというエラーが出ます

    VBA初心者です。 下記のソースで行ラベルを定義しているつもりなのですが、 なぜか行ラベルが定義されていませんというコンパイルエラーがでます。 よろしくお願いします。 Private Sub cmd_Click() On Error GoTo Err_cmd_Click <---ここ Dim inp As String Dim cnt As Integer inp = Forms![フォーム1]![日付] 'フォームの非連結テキストボックスと連動 For cnt = 1 To 31 'インポート・フルパス名作成 If (cnt) < 9 Then strImportFileNameM = "M:\PdxLog\KabeKaKinA" & inp & "0" & cnt + 1 & ".csv" DoCmd.TransferText acImportDelim, , "KabeDownLoad", strImportFileNameM, False Else strImportFileNameM = "M:\PdxLog\KabeKaKinA" & inp & cnt + 1 & ".csv" DoCmd.TransferText acImportDelim, , "KabeDownLoad", strImportFileNameM, False End If Next cnt '正常終了 Exit_cmd_Click: End Sub 'エラー処理 Err_cmd_Click: Beep Select Case Err.Number Case Else MsgBox Err.Number & ":" & Err.Description End Select Resume Next End Sub

  • 「:」を使えば、一行のコードにできるわけではない?

    「:」を使えば、一行のコードにできるわけではないのですか? ifステートメントを1行にしたいのですが Sub test() Dim a As String a = "aiu" If a Like "*i*" Then: Stop: End If End Sub これだと End If に対応する If ブロックがありません。 となってしまいます。 ちゃんと、 Sub test() Dim a As String a = "aiu" If a Like "*i*" Then Stop End If End Sub こうしないとダメですか? なぜ、:は使えないのですか? よろしくお願いします。

  • VBA のコードについて

    すみません、以前にも同じようなご質問をさせて頂いたのですが、どうしても以下のマクロがうまく機能しません。 新しいブックは作成されるのですが、End If以降の検索結果が反映(コビー)されません。 コードに問題があるかアドバイス頂けますと幸いです。 どうぞ宜しくお願いいたします。 Sub sort() Dim i As Long Dim grp As String Dim newBookName As String Dim newBookPath As String Dim newBook As Workbook For i = 2 To 4 LOB = Workbooks("test").Worksheets("grpリスト").Cells(i, 2) newBookName = Workbooks("test").Worksheets("grpリスト").Cells(i, 2) & ".xlsx" newBookPath = ThisWorkbook.Path & "\" & newBookName '指定したパスにファイルが作成済でないかを確認。 If Dir(newBookPath) = "" Then '新しいファイルを作成 Set newBook = Workbooks.Add '新しいファイルをVBAを実行したファイルと同じフォルダ保存 newBook.SaveAs newBookPath Else '既に同名のファイルが存在する場合はメッセージを表示 MsgBox "既に" & newBookName & "というファイルは存在します。" End If With Workbooks("test").Worksheets("マスタ0701").AutoFilterMode = False With .Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).copy Workbooks(grp).Worksheets("Sheet1").Range("A1") '.AutoFilter End With End With Next i End Sub