VBA:Excel :検索(重複/重複でない セルをRangeで取得)
UserFormでlistBoxにシート名を表示
選択したシートに処理
【MAIN】
Private Sub mth_Main() '============================ '// WorkSheet '============================ Dim ListNo As Long ListNo = Me.lst_Sht.ListIndex If ListNo < 0 Then MsgBox "いずれかの行を選択してください" Exit Sub End If Dim ws As Worksheet Set ws = Workbooks(txt_FileOpen_RO.Text).Worksheets(Me.lst_Sht.List(ListNo)) '---------------------- '// 全Trim '---------------------- Dim v For Each v In ws.UsedRange v.Value = Trim(v.Value) Next '======================================== '// 重複/重複でない Range取得 '======================================== ws.Cells.Interior.Color = RGB(255, 255, 255) Dim iCols() As Long ReDim iCols(2) iCols(0) = 4 iCols(1) = 6 iCols(2) = 8 Dim iRow_Last As Long iRow_Last = ws.Cells(ws.Rows.Count, iCols(0)).End(xlUp).Row Dim iRow_Start As Long iRow_Start = 2 Dim rngDuplicateOrNat As Range ' Set rngDuplicateOrNat = mth_GetDuplicateOrNotRng(ws, iRow_Start, iRow_Last, iCols, False) '// 重複でない Set rngDuplicateOrNat = mth_GetDuplicateOrNotRng(ws, iRow_Start, iRow_Last, iCols, True) '// 重複 If Not rngDuplicateOrNat Is Nothing Then rngDuplicateOrNat.Interior.Color = RGB(192, 192, 0) End If Set rngDuplicateOrNat = Nothing Set ws = Nothing End Sub
【処理MAIN】
'** '* 重複/重複でない セルをRangeで取得 '* 指定範囲(指定行(開始/終了)、指定列(複数))の重複/重複でない セルをRangeで取得 '* '* @param ws {Worksheet} WorkSheet '* @param lRow_Start {Long} 開始行 '* @param lRow_End {Long} 終了行 '* @param iCols {Long()} 対象列リスト '* @param bDuplicate {bool} True:重複検索 / False:重複でない検索 '* @return {Range} 検出Range '* Public Function mth_GetDuplicateOrNotRng( _ ws As Worksheet, _ lRow_Start As Long, _ lRow_End As Long, _ iCols() As Long, _ bDuplicate As Boolean _ ) As Range Dim rngDupOrNot As Range '// 重複/重複でない Range '// 汎用変数 Dim r As Long, c As Long Dim v '========================================================= '// 行ごとに各列を結合して、検索対象リスト配列を作成 '========================================================= Dim sCheckList_Rows() As String Dim lCheckList_Cnt As Long For r = lRow_Start To lRow_End Dim sCheckList As String sCheckList = "" For c = LBound(iCols) To UBound(iCols) sCheckList = sCheckList & ws.Cells(r, iCols(c)) Next c ReDim Preserve sCheckList_Rows(lCheckList_Cnt) sCheckList_Rows(lCheckList_Cnt) = sCheckList lCheckList_Cnt = lCheckList_Cnt + 1 Next r '========================================================= '// 行ごとに検索 '========================================================= Dim lDupOrNot_Rows() As Long '重複/重複でない 行番号リスト Dim lDupOrNot_Cnt As Long '重複/重複でない 数 lDupOrNot_Cnt = 0 For r = lRow_Start To lRow_End '// 検索用に文字列結合 Dim sCheckString As String sCheckString = "" For c = LBound(iCols) To UBound(iCols) sCheckString = sCheckString & ws.Cells(r, iCols(c)) Next c '// 完全一致を検索 Dim cltFind_Idx As Collection Set cltFind_Idx = mth_GetStrComp(sCheckList_Rows, sCheckString, True) '// 検索結果(重複/重複でない) If (bDuplicate = True And cltFind_Idx.Count > 1) _ Or (bDuplicate = False And cltFind_Idx.Count = 1) _ Then '// 検索条件(重複) :cltFind_Idx 2つ以上 '// 検索条件(重複でない):cltFind_Idx 1つ ReDim Preserve lDupOrNot_Rows(lDupOrNot_Cnt) lDupOrNot_Rows(lDupOrNot_Cnt) = r lDupOrNot_Cnt = lDupOrNot_Cnt + 1 Else ' 検索条件外 End If Next r '// 該当(重複/重複でない)がなければ終了 If lDupOrNot_Cnt = 0 Then GoTo END_PROC '// Range設定 lDupOrNot_Cnt = 0 For Each v In lDupOrNot_Rows For c = LBound(iCols) To UBound(iCols) If lDupOrNot_Cnt = 0 And c = 0 Then Set rngDupOrNot = ws.Cells(v, iCols(c)) Else Set rngDupOrNot = Union(rngDupOrNot, ws.Cells(v, iCols(c))) End If Next c lDupOrNot_Cnt = lDupOrNot_Cnt + 1 Next v END_PROC: Set mth_GetDuplicateOrNotRng = rngDupOrNot End Function
【比較処理(StrComp)】
'** '* 文字列配列から指定文字列のINDEXを取得する '* '* @param sCheckLists {String()} 検索対象配列 '* @param sCheckString {String} 検索文字列 '* @param bSame {bool} True:完全一致 / False:相違 '* @return {Collection} 検出Index '* Public Function mth_GetStrComp( _ sCheckLists() As String, _ sCheckString As String, _ bCompMode_Same As Boolean _ ) As Collection Dim i As Long Dim cltFind_Idx As Collection Set cltFind_Idx = New Collection Dim lFind_Cnt As Long For i = LBound(sCheckLists) To UBound(sCheckLists) Dim lCompRes As Long lCompRes = StrComp(sCheckLists(i), sCheckString) If (bCompMode_Same And lCompRes = 0) _ Or (bCompMode_Same = False And lCompRes <> 0) _ Then cltFind_Idx.Add i lFind_Cnt = lFind_Cnt + 1 End If Next i Set mth_GetStrComp = cltFind_Idx End Function
VBA:Excel :検索(行番号)
指定文字列の行番号取得
『シート全体』指定文字列の行番号取得
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『シート全体』指定文字列の行番号取得 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_シート全体_指定文字列の行番号アドレス検索() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim sShrStr As String sShrStr = "検索" Dim lRes() As Long lRes = mth_GetCellRowNo_Sheet( _ ws, _ sShrStr _ ) Set ws = Nothing End Sub '************************************************************************* '機能 : シート全体、指定文字列のアドレス検索 '戻り値 : アドレス配列 'ARG1 : WorkSheet 'ARG2 : 検索文字列 '説明 : '************************************************************************* Public Function mth_GetCellRowNo_Sheet( _ ws As Worksheet, _ sSrhString _ ) As Long() Dim lRes_RowNo() As Long Dim vRes_RowNoBuf() Dim v As Variant Dim rngFindCell As Range Dim rngFind_1st As Range Dim rngFind_List As Range '=========================== '// シート全体検索 '=========================== 'LookIn:=xlValues 値検索 'LookAt:=xlWhole 完全一致 'MatchCase:=true 大文字と小文字を区別する(True) 'MatchByte:=True 半角と全角を区別する(True) 'SearchFormat 書式を検索しない(False) Set rngFindCell = ws.Cells.Find( _ what:=sSrhString, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ MatchCase:=True, _ MatchByte:=True, _ SearchFormat:=False _ ) If rngFindCell Is Nothing Then Exit Function Else Set rngFind_1st = rngFindCell Set rngFind_List = rngFindCell End If '-------------------------------------------- '// 検索 → Rangeリスト追加 '-------------------------------------------- Do '// 以降の検索条件も同一で検索 Set rngFindCell = ws.Cells.FindNext(rngFindCell) '// 処理 If rngFindCell.Address = rngFind_1st.Address Then Exit Do '// 最初に見つかったものと同じなら終了 Else 'Find_Listに追加していく Set rngFind_List = Union(rngFind_List, rngFindCell) End If Loop '--------------- '// Result '--------------- Dim i As Long: i = 0 For Each v In rngFind_List ReDim Preserve vRes_RowNoBuf(i) vRes_RowNoBuf(i) = v.Row i = i + 1 Next '// 重複削除 vRes_RowNoBuf = m_配列.mth_DelSameVal(vRes_RowNoBuf) '// Variant -> Long For i = LBound(vRes_RowNoBuf) To UBound(vRes_RowNoBuf) ReDim Preserve lRes_RowNo(i) lRes_RowNo(i) = vRes_RowNoBuf(i) Next mth_GetCellRowNo_Sheet = lRes_RowNo '--------------- '// 後処理 '--------------- Set rngFindCell = Nothing Set rngFind_1st = Nothing Set rngFind_List = Nothing End Function
『範囲指定(Range)』指定文字列の行番号取得
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『範囲指定(Range)』指定文字列の行番号取得 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_範囲_指定文字列の行番号アドレス検索() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Range("B2:E23") Dim sShrStr As String sShrStr = "検索" Dim lRes() As Long lRes = mth_GetCellRowNo_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub '************************************************************************* '機能 : 『範囲指定(Range)』指定文字列の行番号取得 '戻り値 : アドレス配列 'ARG1 : Range 'ARG2 : 検索文字列 '説明 : '************************************************************************* Public Function mth_GetCellRowNo_Range( _ rng As Range, _ sSrhString _ ) As Long() Dim lRes_RowNo() As Long Dim vRes_RowNoBuf() Dim v As Variant Dim rngFindCell As Range Dim rngFind_1st As Range Dim rngFind_List As Range '=========================== '// シート全体検索 '=========================== 'LookIn:=xlValues 値検索 'LookAt:=xlWhole 完全一致 'MatchCase:=true 大文字と小文字を区別する(True) 'MatchByte:=True 半角と全角を区別する(True) 'SearchFormat 書式を検索しない(False) Set rngFindCell = rng.Find( _ what:=sSrhString, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ MatchCase:=True, _ MatchByte:=True, _ SearchFormat:=False _ ) If rngFindCell Is Nothing Then Exit Function Else Set rngFind_1st = rngFindCell Set rngFind_List = rngFindCell End If '-------------------------------------------- '// 検索 → Rangeリスト追加 '-------------------------------------------- Do '// 以降の検索条件も同一で検索 Set rngFindCell = rng.FindNext(rngFindCell) '// 処理 If rngFindCell.Address = rngFind_1st.Address Then Exit Do '// 最初に見つかったものと同じなら終了 Else 'Find_Listに追加していく Set rngFind_List = Union(rngFind_List, rngFindCell) End If Loop '--------------- '// Result '--------------- Dim i As Long: i = 0 For Each v In rngFind_List ReDim Preserve vRes_RowNoBuf(i) vRes_RowNoBuf(i) = v.Row i = i + 1 Next '// 重複削除 vRes_RowNoBuf = m_配列.mth_DelSameVal(vRes_RowNoBuf) '// Variant -> Long For i = LBound(vRes_RowNoBuf) To UBound(vRes_RowNoBuf) ReDim Preserve lRes_RowNo(i) lRes_RowNo(i) = vRes_RowNoBuf(i) Next mth_GetCellRowNo_Range = lRes_RowNo '--------------- '// 後処理 '--------------- Set rngFindCell = Nothing Set rngFind_1st = Nothing Set rngFind_List = Nothing End Function
『指定行範囲』指定文字列の行番号取得
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『指定行範囲』指定文字列の行番号取得 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_指定行範囲_指定文字列の行番号アドレス検索() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Rows("2:12") Dim sShrStr As String sShrStr = "検索" Dim lRes() As Long lRes = mth_GetCellRowNo_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub
重複削除
'************************************************************************* '機能 : 重複削除 '戻り値 : 配列 'ARG1 : 配列 '説明 : Dictionaryで配列要素をKey、Valを追加 ' Key重複できないのでErrで追加不可 ' Key(Val)値は、重複削除の値となる '************************************************************************* Public Function mth_DelSameVal(vArrSrc() As Variant) As Variant() Dim dic Dim i As Long Set dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 0 To UBound(vArrSrc) dic.Add vArrSrc(i), vArrSrc(i) Next mth_DelSameVal = dic.keys Set dic = Nothing End Function
VBA:Excel :検索(アドレス)
- 『シート全体』指定文字列のアドレス検索
- 『指定範囲(Range)』指定文字列のアドレス検索
- 『指定行』指定文字列のアドレス検索
- 『指定行(1行)』指定文字列のアドレス検索
- 『指定列』指定文字列のアドレス検索
- 『指定列(1列)』指定文字列のアドレス検索
- 文字列を検索して、指定アドレスを返す。(Collection)
『シート全体』指定文字列のアドレス検索
参考
ðÉÄÍÜéZðõ·é(Find/FindNext/FindPrevious\bh) FExcel VBAb¦øeNjbNbExcel VBAðwÔÈçmoug
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『シート全体』指定文字列のアドレス検索 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_シート全体_指定文字列のアドレス検索() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim sShrStr As String sShrStr = "検索" Dim sRes() As String sRes = mth_GetCellAddress_Sheet( _ ws, _ sShrStr _ ) Set ws = Nothing End Sub '************************************************************************* '機能 : シート全体、指定文字列のアドレス検索 '戻り値 : アドレス配列 'ARG1 : WorkSheet 'ARG2 : 検索文字列 '説明 : '************************************************************************* Public Function mth_GetCellAddress_Sheet( _ ws As Worksheet, _ sSrhString _ ) As String() Dim sRes_Address() As String Dim v As Variant Dim rngFindCell As Range Dim rngFind_1st As Range Dim rngFind_List As Range '=========================== '// 検索 '=========================== 'LookIn:=xlValues 値検索 'LookAt:=xlWhole 完全一致 'MatchCase:=true 大文字と小文字を区別する(True) 'MatchByte:=True 半角と全角を区別する(True) 'SearchFormat 書式を検索しない(False) Set rngFindCell = ws.Cells.Find( _ what:=sSrhString, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ MatchCase:=True, _ MatchByte:=True, _ SearchFormat:=False _ ) If rngFindCell Is Nothing Then Exit Function Else Set rngFind_1st = rngFindCell Set rngFind_List = rngFindCell End If '-------------------------------------------- '// 検索 → Rangeリスト追加 '-------------------------------------------- Do '// 以降の検索条件も同一で検索 Set rngFindCell = ws.Cells.FindNext(rngFindCell) '// 検索不一致時はループを抜ける If rNext Is Nothing Then Exit Do End If '// 処理 If rngFindCell.Address = rngFind_1st.Address Then Exit Do '// 最初に見つかったものと同じなら終了 Else 'Find_Listに追加していく Set rngFind_List = Union(rngFind_List, rngFindCell) End If Loop '--------------- '// Result '--------------- Dim i As Long: i = 0 For Each v In rngFind_List ReDim Preserve sRes_Address(i) sRes_Address(i) = v.Address i = i + 1 Next mth_Getアドレス_シート全体 = sRes_Address '--------------- '// 後処理 '--------------- Set rngFindCell = Nothing Set rngFind_1st = Nothing Set rngFind_List = Nothing End Function
『指定範囲(Range)』指定文字列のアドレス検索
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『指定範囲(Range)』指定文字列のアドレス検索 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_指定範囲_指定文字列のアドレス検索() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Range("B2:E23") Dim sShrStr As String sShrStr = "検索" Dim sRes() As String sRes = mth_GetCellAddress_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub '************************************************************************* '機能 : 『指定範囲(Range)』指定文字列のアドレス検索 '戻り値 : アドレス配列 'ARG1 : Range 'ARG2 : 検索文字列 '説明 : '************************************************************************* Public Function mth_GetCellAddress_Range( _ rng As Range, _ sSrhString _ ) As String() Dim sRes_Address() As String Dim v As Variant Dim rngFindCell As Range Dim rngFind_1st As Range Dim rngFind_List As Range '=========================== '// 検索 '=========================== 'what:=sSrhString 'After:= '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'LookIn:=xlValues 値検索 'LookAt:=xlWhole 完全一致 'SearchOrder:= 検索方向を指定する。 ' 列方向に検索する(xlByColumns)、 ' 行方向に検索する(xlByRows) 'MatchCase:=true 大文字と小文字を区別する(True) 'MatchByte:=True 半角と全角を区別する(True) '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'SearchDirection:= 前方に検索(xlNext:既定値)、 ' 後方に検索(xlPrevious) 'SearchFormat 書式を検索しない(False) ' Set rngFindCell = rng.Find( _ what:=sSrhString, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ MatchCase:=True, _ MatchByte:=True, _ SearchFormat:=False _ ) If rngFindCell Is Nothing Then Exit Function Else Set rngFind_1st = rngFindCell Set rngFind_List = rngFindCell End If '-------------------------------------------- '// 検索 → Rangeリスト追加 '-------------------------------------------- Do '// 以降の検索条件も同一で検索 Set rngFindCell = rng.FindNext(rngFindCell) '// 検索不一致時はループを抜ける If rNext Is Nothing Then Exit Do End If '// 処理 If rngFindCell.Address = rngFind_1st.Address Then Exit Do '// 最初に見つかったものと同じなら終了 Else 'Find_Listに追加していく Set rngFind_List = Union(rngFind_List, rngFindCell) End If Loop '--------------- '// Result '--------------- Dim i As Long: i = 0 For Each v In rngFind_List ReDim Preserve sRes_Address(i) sRes_Address(i) = v.Address i = i + 1 Next mth_GetCellAddress_Range = sRes_Address '--------------- '// 後処理 '--------------- Set rngFindCell = Nothing Set rngFind_1st = Nothing Set rngFind_List = Nothing End Function
『指定行』指定文字列のアドレス検索
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『指定行』指定文字列のアドレス検索 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_行指定_指定文字列のアドレス検索() '==================================== '単一行:Rows(2) '連続行:Range("2:5") '離れた行:Range("2:3,5:8,12:12") '==================================== Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Range("10:16") Dim sShrStr As String sShrStr = "検索" Dim sRes() As String sRes = mth_GetCellAddress_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub
『指定行(1行)』指定文字列のアドレス検索
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『指定行(1行)』指定文字列のアドレス検索 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_1行指定_指定文字列のアドレス検索() '==================================== '単一行:Rows(2) '連続行:Range("2:5") '離れた行:Range("2:3,5:8,12:12") '==================================== Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Rows(10) Dim sShrStr As String sShrStr = "検索" Dim sRes() As String sRes = mth_GetCellAddress_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub
『指定列』指定文字列のアドレス検索
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『指定列』指定文字列のアドレス検索 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_列指定_指定文字列のアドレス検索() '==================================== '[Columns] ' 単一列:Columns("G") ' 単一列:Columns(2) ' 連続列:Columns("F:E") '------------------------------------- '[Range] ' 連続列:Range("E:F").EntireColumn ' 離れた列:Range("E:E,G:H") ' 離れた列:Range("E1,G1:H1").EntireColumn '==================================== Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Range("E:E,G:H") Dim sShrStr As String sShrStr = "検索" Dim sRes() As String sRes = mth_GetCellAddress_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub
『指定列(1列)』指定文字列のアドレス検索
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『指定列(1列)』指定文字列のアドレス検索 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_1列指定_指定文字列のアドレス検索() '==================================== '[Columns] ' 単一列:Columns("G") ' 単一列:Columns(2) ' 連続列:Columns("F:E") '------------------------------------- '[Range] ' 連続列:Range("E:F").EntireColumn ' 離れた列:Range("E:E,G:H") ' 離れた列:Range("E1,G1:H1").EntireColumn '==================================== Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim rng As Range Set rng = ws.Columns("G") Dim sShrStr As String sShrStr = "検索" Dim sRes() As String sRes = mth_GetCellAddress_Range( _ rng, _ sShrStr _ ) Set ws = Nothing End Sub
文字列を検索して、指定アドレスを返す。(Collection)
Enum enmAddress Address = 1 Row = 2 Col = 3 End Enum
Sub test() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(2) Dim cRes As Collection Set cRes = New Collection Call mth_GetCellAddress_InSheet(ws, "検索", enmAddress.Address, cRes) Debug.Print cRes.Count End Sub
'** '* 文字列を検索して、指定アドレスを返す。 '* '* @arg {ws} '* @arg {str} '* @arg {enmAddress} '* @arg_ref {colc} '* @arg_opt {} '* @ret {} '* '* @note '* Public Sub mth_GetCellAddress_InSheet( _ ws As Worksheet, _ sSrhString As String, _ enmAddress As enmAddress, _ ByRef colcRef As Collection _ ) Dim rngFindCell As Range Dim rngFind_1st As Range Dim rngFind_List As Range '=========================== '// シート全体検索 '=========================== 'LookIn:=xlValues 値検索 'LookAt:=xlWhole 完全一致 'MatchCase:=true 大文字と小文字を区別する(True) 'MatchByte:=True 半角と全角を区別する(True) 'SearchFormat 書式を検索しない(False) Set rngFindCell = ws.Cells.Find( _ what:=sSrhString, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ MatchCase:=True, _ MatchByte:=True, _ SearchFormat:=False _ ) If rngFindCell Is Nothing Then Exit Sub Else Set rngFind_1st = rngFindCell Set rngFind_List = rngFindCell End If '-------------------------------------------- '// 検索 → Rangeリスト追加 '-------------------------------------------- Do '// 以降の検索条件も同一で検索 Set rngFindCell = ws.Cells.FindNext(rngFindCell) '// 処理 If rngFindCell.Address = rngFind_1st.Address Then Exit Do '// 最初に見つかったものと同じなら終了 Else 'Find_Listに追加していく Set rngFind_List = Union(rngFind_List, rngFindCell) End If Loop '--------------- '// Result '--------------- Dim v For Each v In rngFind_List Select Case enmAddress Case Address: colcRef.Add (v.Address) Case Row: colcRef.Add (v.Row) Case Col: colcRef.Add (v.Column) End Select Next '// 重複削除 Dim colcRes As Collection Set colcRes = New Collection Call mth_DelSameVal_colec(colcRes) '--------------- '// 後処理 '--------------- Set rngFindCell = Nothing Set rngFind_1st = Nothing Set rngFind_List = Nothing End Sub
'** '* 重複削除 '* '* @arg {} '* @arg_ref {colc} '* @arg_opt {} '* @ret {} '* '* @note '* Dictionaryで配列要素をKey、Valを追加 '* Key重複できないのでErrで追加不可 '* Key(Val)値は、重複削除の値となる '* Public Sub mth_DelSameVal_colec(ByRef clctRefTg As Collection) Dim dic Dim i As Long Set dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 1 To clctRefTg.Count dic.Add clctRefTg.Item(i), clctRefTg.Item(i) Next '// コレクションクリア For i = 1 To clctRefTg.Count clctRefTg.Remove 1 Next '// コレクション 再設定 Dim vFE_Key For Each vFE_Key In dic clctRefTg.Add (vFE_Key) Next vFE_Key Set dic = Nothing End Sub
VBA:Excel :配列
【 Tips 】
文字列配列から指定文字列のINDEXを取得する
'** '* 文字列配列から指定文字列のINDEXを取得する '* '* @param sCheckLists {String()} 検索対象配列 '* @param sCheckString {String} 検索文字列 '* @param bSame {bool} True:完全一致 / False:相違 '* @return {Collection} 検出Index '* Public Function mth_GetStrComp( _ sCheckLists() As String, _ sCheckString As String, _ bCompMode_Same As Boolean _ ) As Collection Dim i As Long Dim cltFind_Idx As Collection Set cltFind_Idx = New Collection Dim lFind_Cnt As Long Dim lFind_Idx() As Long For i = LBound(sCheckLists) To UBound(sCheckLists) Dim lCompRes As Long lCompRes = StrComp(sCheckLists(i), sCheckString) If (bCompMode_Same And lCompRes = 0) _ Or (bCompMode_Same = False And lCompRes <> 0) _ Then ReDim Preserve lFind_Idx(lFind_Cnt) cltFind_Idx.Add i lFind_Idx(lFind_Cnt) = i lFind_Cnt = lFind_Cnt + 1 End If Next i Set mth_GetStrComp = cltFind_Idx End Function
特定の文字を含む(含まない) :Filter
Filter(sourcearray, match, [ include, [ compare ]])
Sub test() Dim s(4) As String s(0) = "aaaa" s(1) = "aaaa" s(2) = "adaaa" s(3) = "aagaa" s(4) = "ccc" Dim res res = Filter(s, "aaaa", True) res = Filter(s, "aaaa", False) Debug.Print UBound(res) End Sub
空かどうか確認
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 配列かどうか/空かどうか確認 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_配列かどうか_空かどうか確認() Dim lRes As Long Dim vArr() As Variant '// 空の配列:0 lRes = mth_IsArrayEx(vArr) Debug.Print lRes '// 配列:1 vArr = Array("a", 1) lRes = mth_IsArrayEx(vArr) Debug.Print lRes End Sub '************************************************************************* '機能 : 引数が配列かどうか判断し、配列の場合は空かどうか判断する '戻り値 : 1:配列 / 0:空の配列 / -1:配列でない 'ARG1 : 配列 '************************************************************************* Public Function mth_IsArrayEx(vArr As Variant) As Long On Error GoTo ERR_PROC If IsArray(vArr) Then '// 配列確認 mth_IsArrayEx = IIf(UBound(vArr) >= 0, 1, 0) ' 三項演算子: UBound(vArr) >= 0 then 1 else 0 ' 配列が空の場合、Err=9(インデックスが有効範囲にありません) Else mth_IsArrayEx = -1 '配列でない End If Exit Function ERR_PROC: If Err.Number = 9 Then '// UBound(vArr) mth_IsArrayEx = 0 '// vArr = Empty End If End Function
重複削除
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 重複削除 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_重複削除() Dim arr() arr() = Array(1, 1, 1, 4, 8, 5, 4, 3) Dim vResArr() vResArr = mth_DelSameVal(arr()) End Sub '************************************************************************* '機能 : 重複削除 '戻り値 : 配列 'ARG1 : 配列 '説明 : Dictionaryで配列要素をKey、Valを追加 ' Key重複できないのでErrで追加不可 ' Key(Val)値は、重複削除の値となる '************************************************************************* Public Function mth_DelSameVal(vArrSrc() As Variant) As Variant Dim dic Dim i As Long Set dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 0 To UBound(vArrSrc) dic.Add vArrSrc(i), vArrSrc(i) Next mth_DelSameVal = dic.keys Set dic = Nothing End Function
ソート:クイックソート
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// Sort:クイックソート '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_Sort_クイック() Dim arr() arr() = Array(1, 51, 4, 8, 5, 45, 3, 8) Dim vResArr() vResArr = mth_SortQuick(arr(), LBound(arr), UBound(arr)) End Sub '************************************************************************* '機能 : Sort:クイック '戻り値 : 配列 'ARG1 : 対象配列 'ARG2 : LBound(対象配列) 'ARG3 : UBound(対象配列) '説明 : '************************************************************************* Public Function mth_SortQuick( _ ByRef vargArr() As Variant, _ ByVal lngMin As Long, _ ByVal lngMax As Long _ ) As Variant() Dim i As Long, j As Long Dim vBase As Variant Dim vSwap As Variant vBase = vargArr(Int((lngMin + lngMax) / 2)) i = lngMin j = lngMax Do Do While vargArr(i) < vBase i = i + 1 Loop Do While vargArr(j) > vBase j = j - 1 Loop If i >= j Then Exit Do vSwap = vargArr(i) vargArr(i) = vargArr(j) vargArr(j) = vSwap i = i + 1 j = j - 1 Loop If (lngMin < i - 1) Then Call mth_SortQuick(vargArr, lngMin, i - 1) End If If (lngMax > j + 1) Then Call mth_SortQuick(vargArr, j + 1, lngMax) End If mth_SortQuick = vargArr End Function
Match・Index
Private Sub btnOth__Click() '// 出力データ生成 Dim vArr(2, 5) As Variant Dim r As Long, c As Long For r = LBound(vArr, 1) To UBound(vArr, 1) For c = LBound(vArr, 2) To UBound(vArr, 2) vArr(r, c) = CStr(r) & CStr(c) Next c Next r '// 出力 Dim ws02 As Worksheet: Set ws02 = ThisWorkbook.Worksheets("WS02") Dim rngStartCell As Range Set rngStartCell = ws02.Range("B2") ws02.Cells.Clear Call mth_SetGetCellValArr(vArr, rngStartCell) Set rngStartCell = Nothing '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Range検索 Dim rngSrc As Range Set rngSrc = ws02.Range("B2").CurrentRegion '// Srh Rec Dim vSrhRecVal As Variant: vSrhRecVal = 10 Dim lSrhRecNo As Long lSrhRecNo = WorksheetFunction.Match(vSrhRecVal, rngSrc.Columns(1), 0) '// Srh Fld Dim vSrhFldVal As Variant: vSrhFldVal = 4 Dim lSrhFldNo As Long lSrhFldNo = WorksheetFunction.Match(vSrhFldVal, rngSrc.Rows(1), 0) '// ResVal Dim vGetVal As Variant '-- FLD -- vGetVal = rngSrc.Columns(lSrhFldNo) '(ex)Arr(1 To 3, 1 To 1) vGetVal = WorksheetFunction.Transpose(rngSrc.Columns(lSrhFldNo)) '(ex)Arr(3,1) -> Arr(1) '-- REC -- vGetVal = rngSrc.Rows(lSrhRecNo) '(ex)Arr(1 To 1, 1 To 6) vGetVal = WorksheetFunction.Transpose(vGetVal) '(ex)Arr(1,6) -> Arr(6,1) vGetVal = WorksheetFunction.Transpose(vGetVal) '(ex)Arr(6,1) -> Arr(6) 'Recが1つしかないので1次元になる '↓ まとめると↓ vGetVal = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngSrc.Rows(lSrhRecNo))) '-- TABLE -- vGetVal = WorksheetFunction.Index(rngSrc, lSrhRecNo, lSrhFldNo) MsgBox vGetVal '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& '配列検索 '// ResVal vGetVal = WorksheetFunction.Index(WorksheetFunction.Transpose(vArr), lSrhFldNo) '// Fld 1dArr vGetVal = WorksheetFunction.Index(vArr, lSrhRecNo) '// Rec 1dArr vGetVal = WorksheetFunction.Index(vArr, lSrhRecNo, lSrhFldNo) MsgBox vGetVal End Sub
Private Sub btnOth_検索_Click() '// 出力データ生成 Dim vArr(3, 5) As Variant Dim r As Long, c As Long For r = LBound(vArr, 1) To UBound(vArr, 1) For c = LBound(vArr, 2) To UBound(vArr, 2) If r <> 3 Then vArr(r, c) = CStr(r) & CStr(c) Else vArr(r, c) = CStr(r - 2) & CStr(c) End If Next c Next r '// 出力 Dim ws02 As Worksheet: Set ws02 = ThisWorkbook.Worksheets("WS02") Dim rngStartCell As Range Set rngStartCell = ws02.Range("B2") ws02.Cells.Clear Call mth_SetGetCellValArr(vArr, rngStartCell) Set rngStartCell = Nothing '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Dim rngSrhKey As Range Set rngSrhKey = ws02.Range("B2:B5") '// Srh Rec Dim vSrhKey vSrhKey = 10 '// Get RecNos Dim lSrhRecNos() As Long lSrhRecNos = m_検索_アドレス.mth_GetRowNo_Rang(rngSrhKey, vSrhKey) '// 出力開始位置の行Noを「1」として、RecNoを算出 Dim i As Long For i = LBound(lSrhRecNos) To UBound(lSrhRecNos) lSrhRecNos(i) = lSrhRecNos(i) - (ws02.Range("B2").Row - 1) Next i '// Srh Fld Dim rngSrc As Range Set rngSrc = ws02.Range("B2").CurrentRegion Dim vSrhFldVal As Variant: vSrhFldVal = 4 Dim lSrhFldNo As Long lSrhFldNo = WorksheetFunction.Match(vSrhFldVal, rngSrc.Rows(1), 0) '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Range検索 Dim lSrhRecNo For Each lSrhRecNo In lSrhRecNos '// ResVal Dim vGetVal As Variant '-- FLD -- vGetVal = rngSrc.Columns(lSrhFldNo) '(ex)Arr(1 To 3, 1 To 1) vGetVal = WorksheetFunction.Transpose(rngSrc.Columns(lSrhFldNo)) '(ex)Arr(3,1) -> Arr(1) '-- REC -- vGetVal = rngSrc.Rows(lSrhRecNo) '(ex)Arr(1 To 1, 1 To 6) vGetVal = WorksheetFunction.Transpose(vGetVal) '(ex)Arr(1,6) -> Arr(6,1) vGetVal = WorksheetFunction.Transpose(vGetVal) '(ex)Arr(6,1) -> Arr(6) 'Recが1つしかないので1次元になる '↓ まとめると↓ vGetVal = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngSrc.Rows(lSrhRecNo))) '-- TABLE -- vGetVal = WorksheetFunction.Index(rngSrc, lSrhRecNo, lSrhFldNo) MsgBox vGetVal '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& '配列検索 '// ResVal vGetVal = WorksheetFunction.Index(WorksheetFunction.Transpose(vArr), lSrhFldNo) '// Fld 1dArr vGetVal = WorksheetFunction.Index(vArr, lSrhRecNo) '// Rec 1dArr vGetVal = WorksheetFunction.Index(vArr, lSrhRecNo, lSrhFldNo) MsgBox vGetVal Next lSrhRecNo End Sub
Match・VLookup
Private Sub btnOth_VlookUp_Click() '// 出力データ生成 Dim vArr(2, 5) As Variant Dim r As Long, c As Long For r = LBound(vArr, 1) To UBound(vArr, 1) For c = LBound(vArr, 2) To UBound(vArr, 2) vArr(r, c) = CStr(r) & CStr(c) Next c Next r '// 出力 Dim ws02 As Worksheet: Set ws02 = ThisWorkbook.Worksheets("WS02") Dim rngStartCell As Range Set rngStartCell = ws02.Range("B2") ws02.Cells.Clear Call mth_SetGetCellValArr(vArr, rngStartCell) Set rngStartCell = Nothing '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'Range検索 Dim rngSrc As Range Set rngSrc = ws02.Range("B2").CurrentRegion '// Srh Rec Dim vSrhRecVal As Variant: vSrhRecVal = 20 Dim lSrhRecNo As Long lSrhRecNo = WorksheetFunction.Match(vSrhRecVal, rngSrc.Columns(1), 0) '// Srh Fld Dim vSrhFldVal As Variant: vSrhFldVal = 3 Dim lSrhFldNo As Long lSrhFldNo = WorksheetFunction.Match(vSrhFldVal, rngSrc.Rows(1), 0) '// ResVal Dim vGetVal As Variant vGetVal = WorksheetFunction.VLookup(vSrhRecVal, rngSrc, lSrhFldNo, False) MsgBox vGetVal '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& '配列検索 '// ResVal '不可 End Sub
【配列とセル】
セル範囲の値を配列に格納
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// セル範囲の値を配列に格納 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_セル範囲の値を配列に格納() Dim rngSrc As Range Set rngSrc = ThisWorkbook.Worksheets(1).Range("A1:D25") Dim vResArr() As Variant vResArr = mth_GetCellValArr(rngSrc) Set rngSrc = Nothing End Sub '************************************************************************* '機能 : セル範囲の値取得 '戻り値 : 配列 'ARG1 : Range '説明 : '************************************************************************* Public Function mth_GetCellValArr(rng As Range) As Variant() '======================= '// セルの値を要素に代入 '======================= Dim vArrCell As Variant vArrCell = rng.Value '※indexは「1」から mth_GetCellValArr = vArrCell End Function
指定行(開始・終了行指定)、指定列のセル値を「配列の配列」で返す
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ '// 指定行範囲(開始・終了行指定)、指定列のセル値を '// 「配列の配列:Arr(Row)(Col)」で返す '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_指定Row範囲_指定Colリストのセル値を配列の配列で返す() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) '// 対象行範囲 Dim lRowStartEnd(1) As Long lRowStartEnd(0) = 3: lRowStartEnd(1) = 8 '// 抽出列 Dim lColNos(3) As Long lColNos(0) = 2 lColNos(1) = 3 lColNos(2) = 5 lColNos(3) = Columns("G").Column '// 配列の配列データ取得 Dim vRes_ArrOfArr() vRes_ArrOfArr = mth_GetCellVal_ArrOfArr(ws, lRowStartEnd, lColNos) End Sub '************************************************************************* '機能 : 指定行範囲、指定列番号リストのセル値を配列の配列で返す '戻り値 : 配列の配列 'ARG1 : WorkSheet 'ARG2 : 行範囲配列(開始:終了) 'ARG3 : 対象列番号 '説明 : '************************************************************************* Public Function mth_GetCellVal_ArrOfArr( _ ws As Worksheet, _ lRowStartEnd() As Long, _ lColNos() As Long _ ) As Variant Dim vResDat() As Variant Dim lRow As Long Dim i As Long: i = 0 For lRow = lRowStartEnd(LBound(lRowStartEnd)) To lRowStartEnd(UBound(lRowStartEnd)) ReDim Preserve vResDat(i) '// 列データ Dim sBuf() ReDim sBuf(UBound(lColNos)) Dim j As Long: j = 0 Dim vCol As Variant For Each vCol In lColNos sBuf(j) = ws.Cells(lRow, vCol).Value j = j + 1 Next vResDat(i) = sBuf i = i + 1 Next mth_GetCellVal_ArrOfArr = vResDat End Function
配列の配列を2次元配列で返す
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ '// 配列の配列を2次元配列で返す '// '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_配列の配列を2次元配列で返す() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) '// 対象行範囲 Dim lRowStartEnd(1) As Long lRowStartEnd(0) = 3: lRowStartEnd(1) = 8 '// 抽出列 Dim lColNos(3) As Long lColNos(0) = 2 lColNos(1) = 3 lColNos(2) = 5 lColNos(3) = Columns("G").Column '// 配列の配列データ取得 Dim vRes_ArrOfArr() vRes_ArrOfArr = mth_GetCellVal_ArrOfArr(ws, lRowStartEnd, lColNos) '// 配列の配列から2次元配列 Dim vRes_Arr2d() vRes_Arr2d = mth_ArrayOfArray2Array(vRes_ArrOfArr) End Sub '************************************************************************* '機能 : 配列の配列を2次元配列で返す '戻り値 : 2次元配列 'ARG1 : 配列の配列 '説明 : 配列内の配列は、1次元。 ' 先頭配列の要素数に合わせる '************************************************************************* Public Function mth_ArrayOfArray2Array( _ vArrayOfArray As Variant _ ) As Variant Dim r As Long, c As Long '// Dim vRes_2dArr() ReDim vRes_2dArr(UBound(vArrayOfArray), UBound(vArrayOfArray(0))) For r = LBound(vArrayOfArray) To UBound(vArrayOfArray) '// 1段目配列(行) For c = LBound(vArrayOfArray(c)) To UBound(vArrayOfArray(c)) '// 2段目配列(列) vRes_2dArr(r, c) = vArrayOfArray(r)(c) Next Next mth_ArrayOfArray2Array = vRes_2dArr End Function
配列1D → セルに出力
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 配列1Dをセルに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Public Sub psub_配列1Dをセルに出力() Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("WS02") ws.Cells.ClearContents Dim vArr() vArr = Array(1, 3, 5, 4, 2) '// 出力 Dim rngStartCell As Range Set rngStartCell = ws.Range("B2") Call mth_SetCell1DArr(vArr, rngStartCell, "H") ws.Cells.ClearContents Call mth_SetCell1DArr(vArr, rngStartCell, "V") Set rngStartCell = Nothing End Sub '************************************************************************* '機能 : '戻り値 : 'ARG1 : '説明 : '************************************************************************* Public Sub mth_SetCell1DArr( _ vArr() As Variant, _ ByVal rngStartCell As Range, _ ByVal direction As String _ ) '======================= '// '======================= Dim lRowMax As Long: Dim lColMax As Long: Select Case direction Case "H" lRowMax = 1 lColMax = UBound(vArr, 1) - LBound(vArr, 1) + 1 '※出力サイズの設定が必要 rngStartCell.Resize(lRowMax, lColMax).Value = vArr Case "V" lRowMax = UBound(vArr, 1) - LBound(vArr, 1) + 1 lColMax = 1 '※出力サイズの設定が必要 rngStartCell.Resize(lRowMax, lColMax).Value = WorksheetFunction.Transpose(vArr) End Select End Sub
配列2D → セルに出力
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 配列2Dをセルに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Public Sub psub_配列2Dをセルに出力() '// 出力データ生成 Dim vArr(2, 5) As Variant Dim r As Long, c As Long For r = LBound(vArr, 1) To UBound(vArr, 1) For c = LBound(vArr, 2) To UBound(vArr, 2) vArr(r, c) = CStr(r) & CStr(c) Next c Next r '// 出力 Dim ws02 As Worksheet: Set ws02 = ThisWorkbook.Worksheets("WS02") Dim rngStartCell As Range Set rngStartCell = ws02.Range("B2") ws02.Cells.Clear Call mth_SetGetCellValArr(vArr, rngStartCell) Set rngStartCell = Nothing Set ws02 = Nothing End Sub '************************************************************************* '機能 : '戻り値 : 'ARG1 : '説明 : '************************************************************************* Public Sub mth_SetGetCellValArr( _ vArr() As Variant, _ rngStartCell As Range _ ) '======================= '// '======================= Dim lRowMax As Long: lRowMax = UBound(vArr, 1) - LBound(vArr, 1) + 1 Dim lColMax As Long: lColMax = UBound(vArr, 2) - LBound(vArr, 2) + 1 '※出力サイズの設定が必要 rngStartCell.Resize(lRowMax, lColMax).Value = vArr End Sub
【参考 】
【VBA入門】配列総まとめ(初期化、ループ操作、コピー、結合、比較) | 侍エンジニア塾ブログ(Samurai Blog)
【VBA入門】配列総まとめ(初期化、ループ操作、コピー、結合、比較) | 侍エンジニアブログ
配列の宣言、初期化、再定義
配列の宣言、定義
Arrayで初期化
ReDimで再定義
Eraseで配列のメモリを解放
2次元配列(多次元配列)の場合
セルと配列
セルの値を要素に代入
要素の値をセルに格納
配列の要素数を取得
ループで配列の要素を操作
Forループ
For Each
配列をコピー
Sortで配列の要素をソート
※Excelシートを使用
Filterで配列の要素を検索
要素を追加、削除
要素を削除
Joinで配列の要素を結合
JoinとSplitで配列を連結
配列同士を比較
SQL
%:複数文字
_:1文字
C#:TOP
C #
クラス
文字列
■文字列
C#:文字列 - プログラミングのメモ"
String型
・string型の基本
・string型の初期化
・エスケープシーケンス
・@(逐語型文字列)
・文字列 比較
・文字列 判定
・文字列 分割
・文字列 置換
・前後の空白取り除く
・文字数
・文字列-数値 変換
・書式
・数値の「0」パディング
・正規表現
Char型
StringBuilder
配列/コレクション
ADO/Access
C#:ADO(接続型)
C#:ADO(非接続型)
C#:ADO:Access
C#:ADO:Excel
DataSet/DataTable
■データテーブル
C#:データテーブル - プログラミングのメモ"
カラムの追加 / データの追加 / Select(メソッド,LINQ) /Sort(メソッド,LINQ) / 集計(Computeメソッド MAX,MIN, SUM, AVE)
【C#入門】DataTableの使い方(Select、Sort、Compute、LINQも解説) | 侍エンジニアブログ"
LINQ
INIファイル
ファイル/フォルダ
WinAPI
DLL や Win32 API の関数を C# から呼び出す(「P/Invoke Interop Assistant」)
Winフォーム
フォーム
・プロパティ
ENT割り当て:AcceptButton
ESC割り当て:CancelButton
・ダイアログフォームのボタンを押しても閉じないようにする
・ダイアログフォーム
DialogResult
データグリッドビュー
■データグリッドビュー
テキストボックス
C#:Winフォーム:テキストボックス - プログラミングのメモ"
・[Ent]で次へ(TabStrip)
リッチテキストボックス
C#:Winフォーム:リッチテキストボックス - プログラミングのメモ"
コンボボックス
- クリア
- 追加
this.cbo.Items.Clear(); this.cbo.Items.Add(item);
リストボックス
- クリア
- 追加(1項目ずつ、配列)
- 削除(index、項目)
- 選択・取得・解除
- 複数選択
- 選択項目を取得(複数)
this.lst.Items.Clear(); // this.lst.Items.Add(item); // 配列で追加 1 string[] sarr = new string[] { "1", "2", "3", "4", }; this.lst_Sheets.Items.AddRange(sarr); this.Refresh(); // 配列で追加 2 List<string> slst = new List<string>(); slst.Add("a"); slst.Add("b"); slst.Add("c"); slst.Add("d"); this.lst_Sheets.Items.AddRange(slst.ToArray()); this.Refresh(); // 削除 index,項目名 this.lst_Sheets.Items.RemoveAt(0); this.lst_Sheets.Items.Remove("b"); // 選択、取得、解除 this.lst_Sheets.SelectedIndex = 0; Debug.Print( this.lst_Sheets.SelectedIndex.ToString() + " , " + this.lst_Sheets.SelectedItem.ToString() ); this.Refresh(); this.lst_Sheets.SelectedItem = "a"; Debug.Print( this.lst_Sheets.SelectedIndex.ToString() + " , " + this.lst_Sheets.SelectedItem.ToString() ); this.Refresh(); this.lst_Sheets.ClearSelected();
ListView
TreeView
C#:Excel
C#:Excel:ClosedXML - プログラミングのメモ"
C#:Excel:ExcelDataReader - プログラミングのメモ"
C# Excel
C#:Excel
ExcelDataReader で XLS と XLSX の両方を読込む方法
ExcelDataReader
C#:Excel:ExcelDataReader - プログラミングのメモ
Tips
■商と余りを同時に求める
ウェブスクレイピング
title取得:ウェブスクレイピング処理@C#【入門編】 | キャスレーコンサルティング株式会社"
参考
その他
DOSコマンドを実行
・DOSコマンドを実行して出力データを取得するーdobon.net
経過時間
・経過時間 分単位
(dtFin - dtStart).TotalMinute.ToString("0.00");
ダブルコーテーション外し
・ダブルコーテーション外し
.Trim(new char[]{'"'});
URLからTitleを取得
進数変換
ACCDB
プラットフォーム: x64
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //Microsoft ADO Ext.6.0 for DLL and Security using ADOX; namespace Excel_COM_2.AccDB { class clsAccDB { public static void CreateAccdb() { //ADOX.Catalog cat = new Catalog(); // @"Data Source=D:\test.accdb;" + // "Jet OLEDB:Engine Type=6"); //cat = null; ADOX.Catalog cat = new ADOX.Catalog(); //ADODB.Connection db1 = cat.Create("Provider='Microsoft.Jet.OLEDB.4.0';Data Source=" + @"D:" + @"\test1.mdb;Jet OLEDB:Engine Type=5"); //ADODB.Connection db2 = cat.Create("Provider='Microsoft.Jet.OLEDB.4.0';Data Source=" + @"D:" + @"\test2.accdb;Jet OLEDB:Engine Type=5"); ADODB.Connection db3 = cat.Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"D:" + @"\test3.accdb;Jet OLEDB:Engine Type=6"); //cat.ActiveConnection = ConStr; //db1.Close(); //db2.Close(); db3.Close(); } } }
Python:学習03:独習
- 第1章 イントロダクション
- 第2章 Pythonの基本
- 第3章 演算子
- 第4章 制御構文
- 第5章 標準ライブラリ【基本】
- 第6章 標準ライブラリ【コレクション】
- 第7章 標準ライブラリ【その他】
- 第8章 ユーザー定義関数
- 第9章 ユーザー定義関数【応用】
- 第10章 オブジェクト指向構文
- 第11章 オブジェクト指向構文【応用】
第1章 イントロダクション
1.1 Pythonとは?
1.2 Pythonの歴史と現状
1.3 Pythonアプリを開発/実行するための基本環境
1.4 Pythonプログラミングの基本
1.1 hello.py
hello = 'hello world' # print print(hello) print('5' , '3', '7' , sep =';', end = 'end') # 5;3;7end
1.5 Pythonの基本ルール
1.6 開発/学習の前に押さえておきたいテーマ
第2章 Pythonの基本
2.1 変数
2.1
2.2 データ型
第3章 演算子
3.1 算術演算子
3.2 代入演算子
3.3 比較演算子
3.4 論理演算子
3.5 ビット演算子
3.6 演算子の優先順位と結合則
第4章 制御構文
条件分岐
繰り返し処理
ループの制御
例外処理
第5章 標準ライブラリ【基本】
ライブラリの分類
文字列の操作
日付/時刻の操作
第6章 標準ライブラリ【コレクション】
シーケンス型
セット(集合)型
辞書(dict)型
第7章 標準ライブラリ【その他】
正規表現
ファイル操作
ファイルシステムの操作
HTTP経由でコンテンツを取得する
その他の機能
第8章 ユーザー定義関数
ユーザー定義関数の基本
変数の有効範囲(スコープ) 引数のさまざまな記法 関数呼び出しと戻り値