VBA
VBA (Visual Basic for Applications) は Microsoft のプログラミング言語で、主に Microsoft Office スイート内のアプリケーション (Excel、Word、PowerPoint、Access など) のマクロ プログラミングに使用されます。VBA を使用すると、ユーザーはタスクを自動化し、これらのアプリケーションにカスタム機能を追加できます。
VBA の主な機能と目的は次のとおりです。
- プログラミング言語:VBA は Visual Basic 言語に基づいており、プログラミング言語の機能をサポートしています。これにより、ユーザーは条件、ループ、変数、関数、オブジェクト、クラス、モジュールを使用してコードを記述できます。
- 自動化:VBA を使用すると、反復的な業務を自動化できます。たとえば、Excel のワークシート データを処理したり、特定の条件に基づいてドキュメントを生成したりできます。
- ユーザー定義関数とマクロ:ユーザーは VBA を使用してカスタム関数とマクロを作成できます。これは、既存のアプリケーションの機能を拡張したり、特定の要件に合わせたソリューションを開発したりするのに役立ちます。
- イベント処理:VBA を使用すると、ユーザーはアプリケーションで発生するイベント (ボタンのクリック、ワークシートの変更など) を処理できるため、インタラクティブで応答性の高いアプリケーションを作成できます。
- マクロ記録:ユーザーは日常のタスクのアクションを記録して、自動的に編集できる VBA コードを生成できます。これにより、コードをすばやく生成できます。
- Access データベースプログラミング:VBA は、Microsoft Access などのアプリケーションでデータベースと対話するための機能を提供します。
VBA を使用するには、ユーザーは各 Microsoft Office アプリケーションに組み込まれている VBA エディターを使用してコードを記述および実行します。VBA は、ビジネス プロセスの自動化、レポート生成、データ処理、カスタム フォームおよび関数の実装など、さまざまなタスクに使用されます。VBA は強力ですが、VBA を使用するには、コードの記述とデバッグに慣れておく必要があります。
VBAへようこそ
MS Office 製品で VBA にアクセスするには、ALT + F11 キーを押すか、”開発者”タブに移動します。REST API リクエストを送信するために VBA に特別なインストールは必要ありません。
VBA での JSON
通常、ユーザーは VBA (Visual Basic for Applications) で JSON データを処理するために外部ライブラリの支援を必要とします。VBA 自体には、JSON を処理するための組み込み関数やライブラリはありません。JSON データの処理に外部ライブラリを使用するには、”VBA-JSON”などのライブラリを活用できます。次に、VBA で JSON データを処理する方法の概要を示します。
- VBA-JSONライブラリのインストール:VBA-JSON ライブラリは、JSON データを解析および生成するための関数を提供します。まず、このライブラリをダウンロードしてインストールする必要があります。VBA-JSON ライブラリは GitHub で入手でき、JsonConverter.bas ファイルをダウンロードして VBA プロジェクトに追加できます。GitHub - VBA-tools/VBA-JSON: JSON conversion and parsing for VBA
-
VBA プロジェクトにライブラリを追加: VBA-JSON から JsonConverter.bas ファイルを VBA プロジェクトに追加するには、次の手順に従います。
-
VBA プロジェクトを開き、”モジュール”タブを選択します。
-
”ファイル”メニューを選択し、”ファイルのインポート”をクリックします。
-
読み込む JsonConverter.bas ファイルを選択します。
-
-
VBA 参照の追加:JsonConverter.bas ファイルを利用するには、VBA の辞書データ型を早期バインディングとして使用する必要があります。そのためには、”Microsoft Scripting Runtime”への参照を追加する必要があります。
以下の手順に従います。
-
ツールメニューの参照を実行します。
-
”Microsoft Scripting Runtime”を見つけてチェックボックスをオンにし、”OK”をクリックします。
-
VBA - JSON
- JSONデータの解析
上記でインストールしたライブラリの ParseJson 関数を使用して、VBA で JSON データを解析できます。以下は JSON データを解析する例です。
Option Explicit Sub jsonParsing() 'Convert to VBA data by parsing JSON string Dim jsonData As String Dim data As Scripting.Dictionary jsonData = "{""name"": ""John"", ""age"": 30, ""city"": ""New York""}" Set data = JsonConverter.ParseJson(jsonData) 'Print result Debug.Print data("name") 'John End Sub
- JSONデータの作成
VBA で VBA データを JSON に変換するには、ConvertToJson 関数を使用できます。以下は、VBA 辞書を JSON 文字列に変換する例です。
Option Explicit Sub jsonParsing() 'Convert VBA dictionary to JSON string Dim jsonData As String Dim data As Scripting.Dictionary Set data = New Dictionary data.Add "name", "John" data.Add "age", 30 data.Add "city", "New York" jsonData = JsonConverter.ConvertToJson(data) 'Print result Debug.Print (jsonData) '{"name":"John","age":30,"city":"New York"} End Sub
Exercise Examples
VBA を使用して、長方形断面の単純な梁を作成する例を見てみましょう。
VBA の特性を考慮して、この例では Excel シートを使用します。
- まず、シートに変数を配置する入力ウィンドウを作成します。
- REST API リクエストを関数として作成します。
Option Explicit Function WebRequest(Method As String, Command As String, Body As String) As String Dim TCRequestItem As Object Dim baseURL As String Dim URL As String Dim MAPI_Key As Variant Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1") 'SetTimeouts(resolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout) TCRequestItem.SetTimeouts 200000, 200000, 200000, 200000 baseURL = Cells(2, 7).Value MAPI_Key = Cells(3, 7).Value URL = baseURL & Command TCRequestItem.Open Method, URL, False TCRequestItem.SetRequestHeader "Content-type", "application/json" TCRequestItem.SetRequestHeader "MAPI-Key", MAPI_Key TCRequestItem.Send Body WebRequest = TCRequestItem.ResponseText Debug.Print Command & " : " & TCRequestItem.Status & " - " & TCRequestItem.StatusText End Function
- 単純梁を生成するためのサブモジュールを作成します。
Sub CreateSimpleBeam() Dim i, j, k As Integer 'input data from sheets Dim dist As String Dim force As String Dim length As Double Dim height As Double Dim width As Double Dim direction As String Dim loadValue As Double Dim modelID As Range Dim loadCase As Range Dim matSt As String Dim matDB As String dist = UCase(Cells(5, "E").Value) force = UCase(Cells(6, "E").Value) length = Cells(8, "E").Value height = Cells(9, "E").Value width = Cells(10, "E").Value direction = Cells(9, "I").Value loadValue = Cells(9, "J").Value matSt = Cells(5, "J").Value matDB = Cells(6, "J").Value Set loadCase = Range(Cells(12, "I"), Cells(13, "J")) Set modelID = Range(Cells(12, "E"), Cells(15, "E")) 'Dictionary Dim dicMain As Scripting.Dictionary Dim dicSub1 As Scripting.Dictionary Dim dicSub2 As Scripting.Dictionary Dim dicSub3 As Scripting.Dictionary Dim dicSub4 As Scripting.Dictionary Dim response As String Dim body As String 'Create New File response = WebRequest("POST", "/doc/new", "{}") Debug.Print response 'Create Unit Body and Request API Set dicMain = New Dictionary Set dicSub1 = New Dictionary: Set dicSub2 = New Dictionary dicSub2.Add "DIST", dist dicSub2.Add "FORCE", force dicSub1.Add "1", dicSub2 dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("PUT", "/db/unit", body) Debug.Print response Set dicMain = Nothing Set dicSub1 = Nothing: Set dicSub2 = Nothing 'Create Material Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary dicSub3.Add "P_TYPE", 1 dicSub3.Add "STANDARD", matSt dicSub3.Add "DB", matDB dicSub2.Add "TYPE", "CONC" dicSub2.Add "NAME", matDB dicSub2.Add "PARAM", Array(dicSub3) dicSub1.Add modelID(1, 1), dicSub2 dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/matl", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing Set dicSub2 = Nothing: Set dicSub3 = Nothing 'Create Section Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary: Set dicSub4 = New Dictionary dicSub4.Add "vSIZE", Array(height, width) dicSub3.Add "USE_SHEAR_DEFORM", True dicSub3.Add "SHAPE", "SB" dicSub3.Add "DATATYPE", 2 dicSub3.Add "SECT_I", dicSub4 dicSub2.Add "SECTTYPE", "DBUSER" dicSub2.Add "SECT_NAME", "Rectangular" dicSub2.Add "SECT_BEFORE", dicSub3 dicSub1.Add modelID(2, 1), dicSub2 dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/sect", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing Set dicSub2 = Nothing: Set dicSub3 = Nothing: Set dicSub4 = Nothing 'Create Node Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary Dim num_division As Long Dim interval As Double num_division = 20 interval = length / num_division For i = 0 To num_division Set dicSub2 = New Dictionary dicSub2.Add "X", i * interval dicSub2.Add "Y", 0 dicSub2.Add "Z", 0 dicSub1.Add modelID(3, 1) + i, dicSub2 Set dicSub2 = Nothing Next i dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/node", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing 'Create Element Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary For i = 0 To num_division Set dicSub2 = New Dictionary dicSub2.Add "TYPE", "BEAM" dicSub2.Add "MATL", modelID(1, 1) dicSub2.Add "SECT", modelID(2, 1) dicSub2.Add "NODE", Array(modelID(3, 1) + i, modelID(3, 1) + i + 1) dicSub1.Add modelID(4, 1) + i, dicSub2 Set dicSub2 = Nothing Next i dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/elem", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing 'Create Boundary Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary dicSub3.Add "ID", 1 dicSub3.Add "CONSTRAINT", "1111000" dicSub2.Add "ITEMS", Array(dicSub3) dicSub1.Add modelID(3, 1), dicSub2 Set dicSub2 = Nothing: Set dicSub3 = Nothing Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary dicSub3.Add "ID", 1 dicSub3.Add "CONSTRAINT", "0111000" dicSub2.Add "ITEMS", Array(dicSub3) dicSub1.Add modelID(3, 1) + num_division, dicSub2 dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/cons", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing Set dicSub2 = Nothing: Set dicSub3 = Nothing 'Create Load Cases and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary For i = 0 To loadCase.Rows.Count - 1 Set dicSub2 = New Dictionary dicSub2.Add "NAME", loadCase(i + 1, 2) dicSub2.Add "TYPE", "USER" dicSub1.Add i + 1, dicSub2 Set dicSub2 = Nothing Next i dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/stld", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing 'Create Self-Weight Load Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary Set dicSub2 = New Dictionary dicSub2.Add "LCNAME", loadCase(1, 2) dicSub2.Add "FV", Array(0, 0, -1) dicSub1.Add "1", dicSub2 dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/bodf", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing Set dicSub2 = Nothing 'Create Beam Load Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary For i = 0 To num_division - 1 Set dicSub2 = New Dictionary: Set dicSub3 = New Dictionary dicSub3.Add "ID", 1 dicSub3.Add "LCNAME", loadCase(2, 2) dicSub3.Add "CMD", "BEAM" dicSub3.Add "TYPE", "UNILOAD" dicSub3.Add "DIRECTION", direction dicSub3.Add "D", Array(0, 1) dicSub3.Add "P", Array(loadValue, loadValue) dicSub2.Add "ITEMS", Array(dicSub3) dicSub1.Add modelID(4, 1) + i, dicSub2 Set dicSub2 = Nothing: Set dicSub3 = Nothing Next i dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/bmld", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing 'Create Load Combinations Body and Request API Set dicMain = New Dictionary: Set dicSub1 = New Dictionary Set dicSub2 = New Dictionary Dim vCOMB() As Object ReDim vCOMB(loadCase.Rows.Count - 1) For i = 0 To loadCase.Rows.Count - 1 Set dicSub3 = New Dictionary dicSub3.Add "ANAL", "ST" dicSub3.Add "LCNAME", loadCase(i + 1, 2) dicSub3.Add "FACTOR", loadCase(i + 1, 1) Set vCOMB(i) = dicSub3 Set dicSub3 = Nothing Next i dicSub2.Add "NAME", "Comb1" dicSub2.Add "ACTIVE", "ACTIVE" dicSub2.Add "iTYPE", 0 dicSub2.Add "vCOMB", vCOMB dicSub1.Add "1", dicSub2 dicMain.Add "Assign", dicSub1 body = JsonConverter.ConvertToJson(dicMain) response = WebRequest("POST", "/db/lcom-gen", body) Debug.Print response Set dicMain = Nothing: Set dicSub1 = Nothing Set dicSub2 = Nothing End Sub
- 先ほど作成したサブモジュールを実行するボタンを作成します。[開発] タブからボタンを選択します。(開発ツールは、[リボンのカスタマイズ] 設定の [Excel オプション] で有効にできます。)
- 適切な場所にボタンを作成すると、利用可能なマクロ モジュールが下に表示されます。事前に挿入されたサブモジュールを選択して適用します。
- MIDAS CIVIL NX を実行し、API サーバーに接続し、API 設定にベース URL/MAPI キーを入力して、ボタンを実行します。
上記の手順を完了した添付ファイルを参照してください。
これで、MIDAS CIVIL NX で目的の構造が作成されました。
追加のVBAの例
Excel の VBA を使用した PC桁橋
この PC桁橋は、韓国の高速道路橋梁設計基準に基づいて Excel VBA を利用して作成した例です。
構造エンジニアのための最高のツール
VBA は、作成した Excel 構造計算シートと統合することで、最大の威力を発揮します。
特に、計算シートに解析結果を繰り返し入力する場合は、API が最適です。
VBA から始まる MIDAS Open API への第一歩を踏み出していただければ幸いです。