メインコンテンツへスキップ
Example 作成 編集

例:Excel VBA

shutterstock_1916341625-20231115-062550.jpg

VBA

VBA (Visual Basic for Applications) は Microsoft のプログラミング言語で、主に Microsoft Office スイート内のアプリケーション (Excel、Word、PowerPoint、Access など) のマクロ プログラミングに使用されます。VBA を使用すると、ユーザーはタスクを自動化し、これらのアプリケーションにカスタム機能を追加できます。

VBA の主な機能と目的は次のとおりです。

 

  1. プログラミング言語:VBA は Visual Basic 言語に基づいており、プログラミング言語の機能をサポートしています。これにより、ユーザーは条件、ループ、変数、関数、オブジェクト、クラス、モジュールを使用してコードを記述できます。
  2. 自動化:VBA を使用すると、反復的な業務を自動化できます。たとえば、Excel のワークシート データを処理したり、特定の条件に基づいてドキュメントを生成したりできます。
  3. ユーザー定義関数とマクロ:ユーザーは VBA を使用してカスタム関数とマクロを作成できます。これは、既存のアプリケーションの機能を拡張したり、特定の要件に合わせたソリューションを開発したりするのに役立ちます。
  4. イベント処理:VBA を使用すると、ユーザーはアプリケーションで発生するイベント (ボタンのクリック、ワークシートの変更など) を処理できるため、インタラクティブで応答性の高いアプリケーションを作成できます。
  5. マクロ記録:ユーザーは日常のタスクのアクションを記録して、自動的に編集できる VBA コードを生成できます。これにより、コードをすばやく生成できます。
  6. 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 データを処理する方法の概要を示します。

 

  1. VBA-JSONライブラリのインストール:VBA-JSON ライブラリは、JSON データを解析および生成するための関数を提供します。まず、このライブラリをダウンロードしてインストールする必要があります。VBA-JSON ライブラリは GitHub で入手でき、JsonConverter.bas ファイルをダウンロードして VBA プロジェクトに追加できます。GitHub - VBA-tools/VBA-JSON: JSON conversion and parsing for VBA
  2. VBA プロジェクトにライブラリを追加: VBA-JSON から JsonConverter.bas ファイルを VBA プロジェクトに追加するには、次の手順に従います。

    1. VBA プロジェクトを開き、”モジュール”タブを選択します。

    2. ”ファイル”メニューを選択し、”ファイルのインポート”をクリックします。

    3. 読み込む JsonConverter.bas ファイルを選択します。

  3. VBA 参照の追加:JsonConverter.bas ファイルを利用するには、VBA の辞書データ型を早期バインディングとして使用する必要があります。そのためには、”Microsoft Scripting Runtime”への参照を追加する必要があります。

    以下の手順に従います。

    1. ツールメニューの参照を実行します。

    2. ”Microsoft Scripting Runtime”を見つけてチェックボックスをオンにし、”OK”をクリックします。

image-20231020-012805.png

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 シートを使用します。

 

  • まず、シートに変数を配置する入力ウィンドウを作成します。

image-20231020-082034.png

 

  • 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 オプション] で有効にできます。)

image-20231020-093739.png

 

  • 適切な場所にボタンを作成すると、利用可能なマクロ モジュールが下に表示されます。事前に挿入されたサブモジュールを選択して適用します。

image-20231020-094040.png

 

  • MIDAS CIVIL NX を実行し、API サーバーに接続し、API 設定にベース URL/MAPI キーを入力して、ボタンを実行します。

image-20231020-094223.png

上記の手順を完了した添付ファイルを参照してください。

 

これで、MIDAS CIVIL NX で目的の構造が作成されました。

image-20231020-094316.png

 

追加のVBAの例

Excel の VBA を使用した PC桁橋

この PC桁橋は、韓国の高速道路橋梁設計基準に基づいて Excel VBA を利用して作成した例です。

 

構造エンジニアのための最高のツール

VBA は、作成した Excel 構造計算シートと統合することで、最大の威力を発揮します。

特に、計算シートに解析結果を繰り返し入力する場合は、API が最適です。

VBA から始まる MIDAS Open API への第一歩を踏み出していただければ幸いです。

2
コンテンツが役に立ちましたか?