ray88’s diary

お仕事で困ったとき用の自分用の覚書

Python 比較演算子

演算子 説明
== a==b aとbが等しい時True
!= a!=b aとbが等しくない時True
> a>b aがbより大きい時True
>= a>=b aがb以上の時True
> a>b aがbより小さい時True
<= a<=b aがb以下の時True

サンプルコード1

a = 3;b = 3;c = 5
print(a == b)
print(a == c)

出力結果1
f:id:ray88:20210529142836p:plain
サンプルコード2

a = 3;b = 3;c = 5
print(a != b)
print(a != c)

出力結果2
f:id:ray88:20210529143057p:plain
サンプルコード3

a = 60;b = 45
print(a > b)

出力結果3
f:id:ray88:20210529150038p:plain
サンプルコード4

a = 50
print(a >= 50)

f:id:ray88:20210529150038p:plain
サンプルコード5

age = 16
print(13 <= age < 20)

f:id:ray88:20210529150038p:plain

UiPath DataTableにデータを追加する

■データテーブルに値を追加する方法
①「データテーブルを構築」アクティビティでテーブルを構築
f:id:ray88:20210512223817p:plain
②DataRow型変数を作成
f:id:ray88:20210512223630p:plain
③DataRow型変数にAssignアクティビティで新規行を追加 
 Datarow型変数名 = (DataTable型変数名).NewRow
(例)drDataRow = (dtTemp).NewRow
f:id:ray88:20210512223918p:plain
④テーブルに追加したい値を列名または列番号を指定して代入
(例) drDataRow("キャリア") = "au" または drDataRow(0) = "au"
f:id:ray88:20210512224301p:plain
⑤「データ行を追加」アクティビティでデータを追加する。
 プロパティのテーブルにDataTable型変数、行にDataRow型変数を記入する
f:id:ray88:20210512224511p:plain
⑥続けて次の行を追加するには再び③と同じように新規行を追加する。以降、④~⑤まで同じ。
f:id:ray88:20210512224536p:plain
Excelに書き出した結果
f:id:ray88:20210512224640p:plain

VBA クラスモジュール・デフォルトプロパティの設定

■手順
①対象クラスモジュールをエクスポートするとclsファイルが出力される
f:id:ray88:20210510231237p:plain
②clsファイルをメモ帳で開き、デフォルトプロパティに指定したいプロパティに以下コードを追記する

Attribute Value.VB UserMemID = 0

f:id:ray88:20210510230819p:plain
③元々あったCustomersクラスモジュールを解放する
f:id:ray88:20210510233354p:plain
③編集したCustomersクラスのclsファイルをインポートする
f:id:ray88:20210510233729p:plain
④編集後のCustomersクラスがインポートされた
f:id:ray88:20210510234806p:plain

VBA クラスモジュールを応用したコード②

CustomerクラスCustomersクラスを利用し、前回のコードに追記と変更
■前回コードからの変更箇所(3か所)
変数TableRangeを宣言

'表データを格納する変数
     Dim TableValue As Variant
     Dim TableRange As Range

変数TableRangeとTableValueへ値の代入

  '表データをバリアント型配列に格納
    With Worksheets("Sheet2")
        .Select
       lngLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
       Set TableRange = .Range(Cells(4, 2), Cells(lngLastRow, 5))
       TableValue = TableRange.Value       
    End With

If文のところと修正データを表に反映させるところ

If vIndex = False Then
        MsgBox "指定したIDは見つかりません", vbInformation
    Else
        TableValue(vIndex, 3) = 23 '23歳に変更する
    End If
    '修正したデータを表に反映する
    TableRange.Value = TableValue

■サンプルコード

Option Explicit
'表の列番号を定数化
Enum ColName
    ID = 1
    Name = 2
    Age = 3
    Gender = 4
End Enum
Sub 顧客情報を書き換え()

    '表データを格納する変数
     Dim TableValue As Variant
     Dim TableRange As Range
    '表最終行格納用変数
    Dim lngLastRow As Long

    '表データをバリアント型配列に格納
    With Worksheets("Sheet2")
        .Select
       lngLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
       Set TableRange = .Range(Cells(4, 2), Cells(lngLastRow, 5))
       TableValue = TableRange.Value       
    End With
    
    '顧客情報のセットのコレクションであるCustomersクラスのオブジェクトを生成する
    Dim objCustomers As Customers
    Set objCustomers = New Customers
 
    '表データより顧客情報を取得しCustomerオブジェクトに値を設定
    Dim i As Long
    For i = LBound(TableValue) To UBound(TableValue)
            objCustomers.Add TableValue(i, ColName.ID), TableValue(i, ColName.Name), _
                             TableValue(i, ColName.Age), TableValue(i, ColName.Gender)
    Next
    
    'IDが「A0004」の顧客を検索する
    Dim vIndex As Variant
    
    vIndex = objCustomers.SearchItemIndex("A0004")
    If vIndex = False Then
        MsgBox "指定したIDは見つかりません", vbInformation
    Else
        TableValue(vIndex, 3) = 23 '23歳に変更する
    End If
    '修正したデータを表に反映する
    TableRange.Value = TableValue
    Set objCustomers = Nothing
End Sub

実行結果
Valueプロパティを使用して貼り付けているため、表に計算式がある場合は工夫が必要となる。
 基本的には対象の列のみを配列にしてデータを変更すれば良い。
f:id:ray88:20210510222730p:plain

VBA クラスモジュールを応用したサンプルコード①

■サンプルコード内容の図解
f:id:ray88:20210509125455p:plain

■サンプルコード
クラスモジュール(Customerクラスを利用してCustomersクラスを作成)

Option Explicit
'顧客情報セットのコレクション
Private myItems As Collection
'顧客情報IDをキーとしてコレクションの要素番号を紐づけるディクショナリ
Private myDictionary As Object

'変数の初期化
Private Sub Class_Initialize()
    Set myItems = New Collection
    Set myDictionary = CreateObject("Scripting.Dictionary")
End Sub

'変数の破棄
Private Sub Class_Terminate()
    Set myItems = Nothing
    Set myDictionary = Nothing
End Sub

'顧客情報を追加する
Public Sub Add(ByVal vID As String, ByVal vName As String, ByVal vAge As Integer, ByVal vGender As String)
    '顧客情報のセットであるCustomerクラスのオブジェクトを生成する
    Dim vCustomer As Customer
    Set vCustomer = New Customer
    
    'Customerオブジェクトに顧客情報を設定する
    With vCustomer
        .ID = vID
        .Name = vName
        .Age = vAge
        .Gender = vGender
    End With
    
    'コレクションに顧客情報セットを追加する
    myItems.Add vCustomer
    
    'Customerオブジェクトを初期化
    Set vCustomer = Nothing
    
    'ディクショナリに顧客情報のIDと顧客情報コレクションの総要素数を紐づけて格納
    myDictionary.Add Key:=vID, Item:=myItems.Count
    
End Sub

'顧客情報を取得する
Public Property Get Item(ByVal Index As Long) As Customer
    '顧客情報セットのコレクションmyItemよりアイテムのインデックス番号に紐づくデータを返す
    Set Item = myItems.Item(Index)
End Property

'顧客情報を検索する
Public Function SearchItemIndex(ByVal vID As String) As Variant
'-----------------------------------------------------
'機能:キー(対象ID)に紐づく値(インデックス番号)を返す
'引数1:対象ID
'戻り値:ディクショナリに対象IDが存在する場合は
'        IDに紐づく値(インデックス番号)を返す
'    対象IDが存在しない場合は「False」を返す
'-----------------------------------------------------
    SearchItemIndex = False
    
    '対象IDがディクショナリのキーに存在する場合、キーに紐づく値(インデックス番号を返す)
    If myDictionary.Exists(vID) Then
        SearchItemIndex = myDictionary.Item(vID)
    End If
End Function

呼び出し元モジュール

Option Explicit
'表の列番号を定数化
Enum ColName
    ID = 1
    Name = 2
    Age = 3
    Gender = 4
End Enum
Sub 検索テスト()

    '表データを格納する変数
     Dim TableValue As Variant
    '表最終行格納用変数
    Dim lngLastRow As Long

    '表データをバリアント型配列に格納
    With Worksheets("Sheet2")
        .Select
       lngLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
       TableValue = .Range(Cells(4, 2), Cells(lngLastRow, 5))
    End With
    
    '顧客情報のセットのコレクションであるCustomersクラスのオブジェクトを生成する
    Dim objCustomers As Customers
    Set objCustomers = New Customers
 
    '表データより顧客情報を取得しCustomerオブジェクトに値を設定
    Dim i As Long
    For i = LBound(TableValue) To UBound(TableValue)
            objCustomers.Add TableValue(i, ColName.ID), TableValue(i, ColName.Name), _
                             TableValue(i, ColName.Age), TableValue(i, ColName.Gender)
    Next
    
    'IDが「A0004」の顧客を検索する
    Dim vIndex As Variant
    
    vIndex = objCustomers.SearchItemIndex("A0004")
    If vIndex = False Then
        MsgBox "指定したIDは見つかりません", vbInformation
    Else
        Debug.Print objCustomers.Item(vIndex).Name
        Debug.Print objCustomers.Item(vIndex).Age
        Debug.Print objCustomers.Item(vIndex).Gender
    End If
    Set objCustomers = Nothing
End Sub

Sheet2を読み取ってイミディエイトウィンドウへ出力した結果
f:id:ray88:20210509130649p:plain