![]() |
||||
Option Explicit '-------------------------------------------------------- 'ユーザー定義型 '-------------------------------------------------------- Public Type SyainData Id As String Name As String End Type Sub test() Dim i As Long Dim wrkSyainData() As SyainData Call GetSyainData(wrkSyainData()) For i = 1 To 2 MsgBox wrkSyainData(i).Id & "-" & wrkSyainData(i).Name Next i End Sub Function GetSyainData(ByRef prmSyainData() As SyainData) Dim i As Long ReDim prmSyainData(2) prmSyainData(1).Id = "001" prmSyainData(1).Name = "aaa" prmSyainData(2).Id = "002" prmSyainData(2).Name = "bbb" End Function '-------------------------------------------------------- '配列の受け渡し '-------------------------------------------------------- Sub sample4() Dim i As Long Dim j As Long Dim strTbl() As String Erase strTbl() j = 3 ReDim strTbl(j) Call sample41(strTbl()) For i = 1 To UBound(strTbl()) MsgBox strTbl(i) Next i End Sub Function sample41(prm() As String) prm(1) = "001" prm(2) = "002" prm(3) = "003" End Function '-------------------------------------------------------- '配列をセルに代入する '-------------------------------------------------------- Sub SampleA1() Dim buf As String buf = "田中" & vbCrLf & "鈴木" & vbCrLf & "山田" Range("A1:C1") = Split(buf, vbCrLf) End Sub Sub SampleA2() Dim buf As String buf = "田中" & vbCrLf & "鈴木" & vbCrLf & "山田" Range("A1:A3") = WorksheetFunction.Transpose(Split(buf, vbCrLf)) End Sub Sub SampleA3() Dim buf As String, tmp As Variant With CreateObject("Scripting.FileSystemobject").GetFile("C:\ak\down\Sample.txt").OpenAsTextStream buf = .ReadAll .Close End With tmp = Split(buf, vbCrLf) Range(Cells(1, 1), Cells(UBound(tmp), 1)) = WorksheetFunction.Transpose(tmp) End Sub '-------------------------------------------------------- '配列フィルター '-------------------------------------------------------- Sub Sample3() Dim strArray(4) As String Dim strResult() As String strArray(0) = "東京" strArray(1) = "東京名古屋" strArray(2) = "大阪" strArray(3) = "京都" strArray(4) = "名古屋" strResult = Filter(strArray, "京", , vbTextCompare) MsgBox Join(strResult, vbCrLf) End Sub '-------------------------------------------------------- '配列結合 '-------------------------------------------------------- Sub Sample2() Dim strArray(2) As String Dim strData As String strArray(0) = "ABC" strArray(1) = "DEF" strArray(2) = "GHI" strData = Join(strArray) & vbCrLf strData = strData & Join(strArray, "") & vbCrLf strData = strData & Join(strArray, "+") MsgBox strData End Sub '-------------------------------------------------------- '数値と単位分解 '-------------------------------------------------------- Sub SeparateValue() MsgBox getNum("1.2cm") MsgBox getUnit("1.2cm") End Sub Function getNum(strPrm As String) As Variant Dim dblVal As Double dblVal = Val(strPrm) getNum = dblVal End Function Function getUnit(strPrm As String) As Variant Dim dblVal As Double Dim strUnit As String dblVal = Val(strPrm) strUnit = Replace(strPrm, dblVal, "") getUnit = strUnit End Function '-------------------------------------------------------- '区切り編集 '-------------------------------------------------------- Sub sample() Dim i As Long Dim strwk strwk = Split("123,abc,あいうえお", ",") For i = 0 To UBound(strwk) MsgBox strwk(i) Next i End Sub '-------------------------------------------------------- '[XL2002]配列を返す関数を作成する方法 'http://support.microsoft.com/kb/402326/ja '-------------------------------------------------------- Function Sample1() Dim i As Integer Dim ret(0 To 9) As Integer '10 要素の整数型配列を宣言します。 For i = 0 To 9 '配列にダミーのデータを代入します。 ret(i) = i Next Sample1 = ret '配列名で配列を戻り値として指定します。 End Function '-------------------------------------------------------- '配列転記 最小、最大 値求める '-------------------------------------------------------- Option Explicit Dim ST As Excel.Worksheet Dim i As Integer Dim j As Integer Dim varwk As Variant Sub sample1() '配列転記 ワーク→セル Dim strwk(1 To 3, 1 To 4) As String ' 3×4の2次元配列 Set ST = Worksheets("Sheet2") Worksheets(ST.Name).Activate ST.Range("A1").CurrentRegion.Select Selection.Clear varwk = Array("A", "B", "C", "D") For i = 1 To 3 For j = LBound(varwk) To UBound(varwk) '0 to 3 strwk(i, j + 1) = varwk(j) & i Next j Next i '配列を転記 ST.Cells(1, 1).Resize(3, 4).Value = strwk End Sub Sub sample2() '配列転記 セル Set ST = Worksheets("Sheet2") Worksheets(ST.Name).Activate ST.Range("A1").CurrentRegion.Select Selection.Clear varwk = Array("A", "B", "C", "D") For i = 1 To 3 For j = LBound(varwk) To UBound(varwk) '0 to 3 Cells(i, j + 1) = varwk(j) & i Next j Next i End Sub Sub sample3() '最小、最大を求める 'MsgBox ActiveSheet.Name Set ST = Worksheets("Sheet1") Worksheets(ST.Name).Activate ST.Range("A1").CurrentRegion.Select Selection.Clear varwk = Array("'6/20", "'12/2", "'06/01", "'12/11") 'varwk = Array("'5", "'3", "'6", "'4") For i = LBound(varwk) To UBound(varwk) '0 to 3 ST.Cells(i + 1, 1) = varwk(i) 'sort文字列で並べ替え(日付には適していない) ST.Cells(i + 1, 2) = varwk(i) 'sortなし ST.Cells(i + 1, 3) = varwk(i) 'sortマクロ ST.Cells(i + 1, 4) = Replace(varwk(i), "'", "") 'sort日付変換後であれば有効 Next i i = i + 1 ST.Cells(i, 1) = "SORT有.Sort" ST.Cells(i, 2) = "SORT無" ST.Cells(i, 3) = "SORT有EXCEL" ST.Cells(i, 4) = "SORT有.Sort" ST.Range(Cells(1, 1), Cells(4, 1)).Sort Key1:=ST.Cells(1, 1), Order1:=xlAscending ST.Range("C1:C4").Select Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortTextAsNumbers ST.Range("D1:D4").Select Selection.NumberFormatLocal = "m""月""d""日"";@" ST.Range(Cells(1, 4), Cells(4, 4)).Sort Key1:=ST.Cells(1, 4), Order1:=xlAscending ' Debug.Print Cells(1, 1).Value ' Debug.Print Cells(4, 1).Value ST.Cells(1, 1).Select End Sub Sub a0() ''検索元の配列 'Dim ary As String() = New String() {"red", "blue", "white", "blue", "red"} ''"blue"の位置を取得する 'Dim index1 As Integer = Array.IndexOf(ary, "blue") ''"1"を返す ''"gold"の位置を取得する 'Dim index2 As Integer = Array.IndexOf(ary, "gold") ''存在しないので、"-1"を返す '検索元の配列 Dim userAddress As Variant userAddress = Array("東京都", "北海道", "愛知県") If InStr(vbTab & Join(userAddress, vbTab) & vbTab, vbTab & "北海道" & vbTab) > 0 Then MsgBox "北海道あり" Else MsgBox "北海道なし" End If If InStr(vbTab & Join(userAddress, vbTab) & vbTab, vbTab & "大阪府" & vbTab) > 0 Then MsgBox "大阪府あり" Else MsgBox "大阪府なし" End If End Sub Sub a1() Dim strAddress As String Dim strArray() As String Dim strMsg As String '---複数のセル範囲のアドレスを取得 strAddress = Application.InputBox( _ Prompt:="複数範囲を選択してください" & vbCr & "( [Ctrl] + 範囲選択 )" _ , Type:=8).Address '---(1)Split関数で配列に格納 strArray = Split(strAddress, ",") '---(2)文字列"A"を含むアドレスだけを残す strArray = Filter(strArray, "A", True) '---(3)Join関数で配列からカンマ区切りの文字列に戻す strAddress = Join(strArray, ",") If strAddress = "" Then MsgBox "A列を含む範囲はありませんでした" Else Range(strAddress).Select MsgBox "A列を含むセル範囲 (" & strAddress & ") だけを選択しました" End If End Sub Sub a2() Dim i As Integer Dim dArray() As String ReDim Preserve dArray(3) dArray(0) = "January" dArray(1) = "February" dArray(2) = "March" dArray(3) = "April" For i = 0 To UBound(dArray) Debug.Print dArray(i) Next End Sub Sub a3() 'Microsoft Scripting Runtime Dim dict As Variant Dim key As Variant Dim data As Variant Set dict = CreateObject("Scripting.Dictionary") dict("name") = "鈴菜" dict("sex") = "女" dict("age") = 10 For Each key In dict data = dict(key) Debug.Print key & ": " & data Next Debug.Print "name: " & dict("name") Debug.Print "sex: " & dict("sex") Debug.Print "age: " & dict("age") Set dict = Nothing End Sub |
||||