-
以前の記事では配列の初期化について記しましたが、今回は配列の要素に関しての増減などを行う処理についてです。
⇒JavaScript 配列の作成と初期化について
配列を操作するメソッドには以下の様なものがあります。メソッド 構文 説明 push Array.push( value, ...) 配列の最後尾に要素を追加する。(要素は値そのもの、または配列) pop Array.pop() 配列の最後尾から要素を削除する。 unshift Array.unshift( value, ...) 配列の先頭に要素を追加する。(要素は値そのもの、または配列) shift Array.shift() 配列の先頭から要素を削除する。 concat Array = Array.concat( value, ...) 配列の最後尾に要素を追加し、結果の配列を返す。 slice Array = Array.slice( begin [, end] ) 配列の開始から終了までの要素を別の配列として返す。
終了指定が無い場合は最後の要素までが範囲とする。
(但し終了は含まれない)splice Array = Array.splice( index, howMany, [element1], ... ) 指定配列をindexで指定された位置から、howManyで指定された個数分を取除き、要素を追加する。
戻り値:削除された配列を返す。
index:値が配列の長さより大きい場合、配列の長さと同じ値となります。値が負数の場合、配列の終端からその値を引いた数が開始位置となります。
howMany:配列から取り除く古い要素の数を示す整数。howMany が 0 の場合、どの要素も取り除かれません。
配列の要素への最後尾への追加と削除、及び先頭への追加と削除の例を示します。 要素の追加は1個のみではなく連続して引数として渡せるため、そのままの順番で配列に追加されます。配列への要素の追加と削除
//配列の宣言 var arrStr = ["aaaa", "bb", "ccccc"]; console.log(arrStr); // Array(3) [ "aaaa", "bb", "ccccc" ] と表示される //要素の最後尾追加 : push arrStr.push("dddd"); console.log(arrStr); // Array(4) [ "aaaa", "bb", "ccccc", "dddd" ] と表示される //要素の最後尾削除 : pop arrStr.pop(); // "dddd" 削除 arrStr.pop(); // "ccccc"削除 console.log(arrStr); // Array(2) [ "aaaa", "bb" ] と表示される //複数要素の先頭追加 : unshift arrStr.unshift("dddd", "ee"); console.log(arrStr); // Array(4) [ "dddd", "ee", "aaaa", "bb" ] と表示される //要素の先頭削除 : shift arrStr.shift(); // "dddd"削除 console.log(arrStr); // Array(3) [ "ee", "aaaa", "bb" ] と表示される
上の例では個別の要素を追加する例でしたが、追加処理の引数として配列そのものを指定できます。 以下にその例を示しますが、追加された配列は最初の配列の中の入れ子での配列になってしまいますので注意が必要です。
配列への配列の追加
//配列の宣言 var arrStr = ["aaaa", "bb", "ccccc"]; console.log(arrStr); // Array(3) [ "aaaa", "bb", "ccccc" ] と表示される //配列データの最後尾追加 : push (Array()) var arrStr2 = ["111", "222"]; arrStr.push(arrStr2); console.log(arrStr); // Array(4) [ "aaaa", "bb", "ccccc", ["111", "222"] ] と表示される
この現象を解消する為に concat を使って配列を連結し結果を新しい配列を返す様にします。 concat の戻り値は配列なので新しい配列変数に代入しても、既に在る配列変数に代入することもできます。配列の連結
//配列の宣言 var arrStr = ["aaaa", "bb", "ccccc"]; console.log(arrStr); // Array(3) [ "aaaa", "bb", "ccccc" ] と表示される //第2の配列の宣言 var arrStr2 = ["111", "222"]; //配列を連結し、新しい配列にコピー var arrStr3 = arrStr.concat(arrStr2); console.log(arrStr3); // Array(5) [ "aaaa", "bb", "ccccc", "111", "222" ] と表示される //配列を連結し、元の配列を置き換え var arrStr = arrStr.concat(arrStr2); console.log(arrStr); // Array(5) [ "aaaa", "bb", "ccccc", "111", "222" ] と表示される
配列の切出しを slice を使って行う例を以下に示します。配列の切出し
//配列の宣言 var arrStr = ["aaaa", "bb", "ccccc", "d", "eee" ]; console.log(arrStr); // Array(5) [ "aaaa", "bb", "ccccc", "d", "eee" ] と表示される //開始のみ指定 var arrStr2 = arrStr.slice(1); console.log(arrStr2); // Array(4) [ "bb", "ccccc", "d", "eee" ] と表示される //開始、終了指定 var arrStr3 = arrStr.slice(1, 4); console.log(arrStr3); // Array(3) [ "bb", "ccccc", "d" ] と表示される //開始、終了指定:終了が範囲を超えた指定 var arrStr4 = arrStr.slice(1, 10); console.log(arrStr4); // Array(4) [ "bb", "ccccc", "d", "eee" ] と表示される
配列の要素の入替を splice を使って行う例を以下に示します。配列の要素の入替
//配列の宣言 var arrStr = ["aaaa", "bb", "ccccc", "d", "eee" ]; console.log(arrStr); // Array(5) [ "aaaa", "bb", "ccccc", "d", "eee" ] と表示される //Index、削除個数、追加要素の指定 var arrStr2 = arrStr.splice(1, 2, "111", "22"); //元の配列の表示 console.log(arrStr); // Array(5) [ "aaaa", "bb", "111", "22", "d", "eee" ] と表示される //削除された配列の表示 console.log(arrStr2); // Array(2) [ "bb", "ccccc" ] と表示される
PR -
連想配列とは通常の配列の様に要素を指標によって参照するのではなく、キーとなる文字列とそれに対応する値を持ちます。 しかし、JavaScript では指標に文字列を指定できません。但し、 Array のプロパティとして取り扱うことで連想配列の様な振る舞いが可能です。
連想配列的宣言
//連想配列の宣言 var arrVar = { name: "test", value: "12345" }; console.log(arrVar); // Object { name: "test", value: "12345" } と表示される //個別の表示 console.log(arrVar["name"]); // test と表示される console.log(arrVar["value"]); // 12345 と表示される
上の例では arrVar クラスを配列の様に宣言し生成していますが、コンソールには Object と表示されます。 これはオブジェクトのプロパティであることが分かります。
それぞれのプロパティを個別に表示させると、連想配列的に値を返します。
また、以下の例の様に、宣言された連想配列に後から要素を追加することもできます。
連想配列的宣言と値の追加
//連想配列の宣言 var arrVar = { name: "test", value: "12345" }; //連想配列への要素追加 arrVar["item"] = "aaaaaaa"; console.log(arrVar); // Object { name: "test", value: "12345", item: "aaaaaaa" } と表示される
ここで連想配列と言っているものはオブジェクトであり、その中のプロパティを宣言してそれぞれをプロパティ名(キー名)によりアクセスします。 オブジェクトのプロパティへのアクセスはドットで連結することで行えます。以下に例を示します。
連想配列のプロパティへのアクセス
//連想配列の宣言 var arrVar = { name: "test", value: "12345" }; //連想配列の各要素へのアクセス(プロパティを指定) console.log(arrVar.name); // test と表示される console.log(arrVar.value); // 12345 と表示される //要素の追加 arrVar.item = "aaaa"; console.log(arrVar.item); // aaaa と表示される console.log(arrVar); // Object { name: "test", value: "12345", item: "aaaa" } と表示される
オブジェクトへのプロパティ追加は簡単にできるところが JavaScript の自由度を高めていると思います。 (逆に言えば、プログラムを難しくしているのかもしれませんが)
実はオブジェクトには関数も持つことが出来ます。以下の例は最初に宣言したオブジェクトに対して後から関数を追加しています。
連想配列への関数追加
//連想配列の宣言 var arrVar = { name: "test", value: "12345" }; //要素の追加 arrVar.item = "aaaa"; //関数の追加 arrVar.func = function() { alert("test"); // 単にメッセージで「test」の表示 } console.log(arrVar); // Object { name: "test", value: "12345", item: "aaaa", func: func() … } と表示される //関数の実行 arrVar.func(); // 「test」の表示が行われる
この関数は後から追加しなくても、最初の宣言で行えばもっと簡素にできます。
連想配列の関数宣言
//連想配列の宣言 var arrVar = { name: "test", value: "12345", item: "aaaa", func: function() { alert("test"); // メッセージで「test」の表示 } }; console.log(arrVar); // Object { name: "test", value: "12345", item: "aaaa", func: func() … } と表示される //関数の実行 arrVar.func(); // 「test」の表示が行われる
-
JavaScript でも当然ですが配列が使えます。VB.NETの配列と似たところがありますので、VB.NETを使っている方は特に問題無く理解ができます。 先ずは、配列の枠だけを宣言してみます。以下のソースでは空の配列を宣言し値を追加しています。
以下の処理で console.log を使用していますが、これによりブラウザのコンソール画面に変数の内容が表示されます。空の配列を宣言と値の追加
//空の配列宣言 var arrNum = new Array(); //未定義の指標での代入で追加 arrNum[0] = 100; arrNum[1] = 200; arrNum[2] = 300; console.log(arrNum); // Array(3) [ 100, 200, 300 ] と表示される
上の例では Array クラスを宣言し生成していますが以下の方法でも同じことが出来ます。
値の追加は配列のメソッド push を使って最後尾に追加しています。
空の配列を宣言と値の追加その2
//空の配列宣言 var arrNum = []; //配列のpush メソッドで配列の最後尾に追加する arrNum.push(100); arrNum.push(200); arrNum.push(300); console.log(arrNum); // Array(3) [ 100, 200, 300 ] と表示される
そこで、配列の初期化の方法ですが、上記の例の Array の括弧の中に要素をカンマ区切りで行えます。Arrayでの配列の初期化
//空の配列宣言 var arrNum = new Array(100, 200, 300); console.log(arrNum); // Array(3) [ 100, 200, 300 ] と表示される
[] の中にも同様にできます。こちらの方が簡単です。
配列の初期化では要素の指標が0(ゼロ)から振られますので注意が必要です。以下の例では配列の参照を行って合計の計算を行っています。[]での配列の初期化
//空の配列宣言 var arrNum = [100, 200, 300]; console.log(arrNum); // Array(3) [ 100, 200, 300 ] と表示される //配列の参照例としての合計計算 var sum = 0; for(i = 0; i < arrNum2.length; i++) { sum += arrNum2[i]; //指標は[0]から振られている } console.log(sum); // 600 と表示される
配列の要素は数値データとは限らず文字列を宣言することもできます。 以下の例は [] で要素が4個の文字列配列の初期化宣言を行っています。要素が文字列の配列の初期化
//配列宣言(単純な文字列配列) var arrStr = ["aaaa", "bb", "ccccc", "ddd"]; console.log(arrStr); // Array(4) [ "aaaa", "bb", "ccccc", "ddd" ] と表示される //配列内の文字列連結 var str = ""; for(i = 0; i < arrStr.length; i++) { str += arrStr[i]; } console.log(str); // aaaabbcccccddd と表示される
尚、配列の宣言で文字列と数値を混在させたものを宣言することが出来ます。 以下の例がそれですが、 arrMix の中身は混在していることが分かります。 文字列連結において文字列と数値の + 処理では数値が文字列に暗黙の変換が行われるため、結果が文字列になります。要素が文字列の配列の初期化
//配列宣言 var arrMix = ["aaaa", 222, "ccccc", 4444]; console.log(arrMix); // Array(4) [ "aaaa", 222, "ccccc", 4444 ] と表示される //配列内の文字列連結 var str = ""; for(i = 0; i < arrMix.length; i++) { str += arrMix[i]; // 数値が文字列に暗黙の変換 } console.log(str); // aaaa222ccccc4444 と表示される
-
前回はWord文書の中で文字列を検索しその部分を指定された文字列で置き換える処理を作成しましたが、 カーソルの位置が最後の置換処理を行った場所に移動します。
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
これでは文書の途中にカーソルがありますので、文書の先頭が見たい場合には都合が悪いので、カーソルを先頭に移動する関数を作成します。
カーソルの移動には Bookmark オブジェクトを利用します。 このオブジェクトには以下の様に定義済みのものがありますのでこれを利用します。Bookmark 説明 \Sel 現在の選択範囲またはカーソル位置 \PrevSel1 最後に編集を行った範囲 \PrevSel2 2個前に編集を行った範囲 \StartOfSel 現在の選択範囲の開始位置 \EndOfSel 現在の選択範囲の終了位置 \Line 現在の行または現在の選択範囲の最初の行 \Char 現在の文字。範囲が選択されていない場合はカーソルの右側の文字、また範囲が選択されている場合はその範囲の先頭文字を指します \Para カーソルのある段落か、複数の段落を選択すると、選択範囲の最初の段落 \Section 現在のカーソルのあるセクションか、選択範囲に複数のセクションが含まれている場合、最初のセクション \Doc 作業中の文書全体 \Page 現在のページ \StartOfDoc 文書の先頭 \EndOfDoc 文書の末尾 \Cell テーブル内の現在のセル、複数のセルが選択されている場合は先頭のセル \Table 現在のテーブル、複数のテーブルが選択されている場合は先頭テーブル
この Bookmark オブジェクトに \StartOfDoc を指定し、そのオブジェクトを選択することでカーソル移動が行えます。 関数としては以下の通りで、特に難しくはありません。
尚、 Range オブジェクトを使ってもできます。
Word文書カーソル先頭移動関数
'****************************************************************************** ' Word文書・カーソル先頭移動 '****************************************************************************** ' 関数名 : WordMoveToTop() '****************************************************************************** Public Sub WordMoveToTop() On Error GoTo Err_WordMoveToTop 'カーソル先頭移動 WordDoc.Bookmarks("\StartOfDoc").Select '以下の方法でもOK 'WordDoc.Range(0, 0).Select Exit_WordMoveToTop: Exit Sub Err_WordMoveToTop: MsgBox Err.Description Resume Exit_WordMoveToTop End Sub
この関数をWord処理用クラスに追加して、それを使用する例として、access フォームに1個のボタンのみを設置し、そのクリックイベントでワード文書を開く様にしてみます。
Word文書文字列置換関数の使用例
Option Compare Database ' クラスWordオブジェクト Private mclsWord As clsWord '------------------------------------------------------------------------------ ' フォームロード時イベント '------------------------------------------------------------------------------ Private Sub Form_Load() Set mclsWord = New clsWord End Sub '------------------------------------------------------------------------------ ' フォームクローズイベント '------------------------------------------------------------------------------ Private Sub Form_Close() 'ワードクローズ mclsWord.WordClose 'Wordオブジェクト解放 Set mclsWord = Nothing End Sub '------------------------------------------------------------------------------ ' コマンド1開始 '------------------------------------------------------------------------------ Private Sub コマンド1_Click() Dim strPath As String 'ワードファイルを読み込み、文章を編集する状態にする strPath = Application.CurrentProject.path & "\" & "find-test.docx" 'ワードファイルを読込み編集状態で表示する mclsWord.WordOpen strPath, True ' Dim arrVaKey() As Variant Dim arrVaVal() As Variant arrVaKey = Array("@test1@", _ "@test2@", _ "@test3@", _ "@test4@") arrVaVal = Array("テスト1", _ "テスト2", _ "テスト3", _ "テスト4-1" & vbCrLf & "テスト4-2" & vbCrLf & "テスト4-3") '置換処理(左揃えを行わない) mclsWord.WordReplace arrVaKey, arrVaVal, False arrVaKey = Array("@test5@") arrVaVal = Array("テスト5-1" & vbCrLf & "テスト5-2" & vbCrLf & "テスト5-3") '置換処理(左揃えを行う) mclsWord.WordReplace arrVaKey, arrVaVal, True '先頭へ移動 mclsWord.WordMoveToTop End Sub
「コマンド1開始」を押下することで、ワードが起動し置換処理の結果が表示され、カーソルが先頭に移動していることが分かります。
関連する記事
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
⇒access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
-
access vba でのWord用クラス作成について以下のページで説明しましたが、 今回はWord文書の中で文字列を検索し、その部分を指定された文字列で置き換える処理をクラスに追加してみます。
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
関数を追加する前に今回使用する Find オブジェクトについてみてみます。
以下の例は抜粋なのですが、Word.Documentオブジェクトとして WrdDoc が既に生成されているものとします。
Word.Documentオブジェクトの Content プロパティの Find オブジェクトを利用します。
(この Content プロパティは「文書全体を示す Range オブジェクト」のことで、 Range オブジェクトの中の Find オブジェクトとなります)
Find オブジェクトの以下の各プロパティをそれぞれ指定し Execute メソッドで処理種別を指定し、 置換処理等を行います。この処理種別には多くのものがありますので、それぞれについては正規の説明書を見て下さい。
今回は文字列の置換ですので、Replace を指定しています。 Replace の引数としては置換する文字列の個数 (1つだけ:wdReplaceOne、すべて:wdReplaceAll、または置換しない:wdReplaceNone) を指定します。
この例は、文書全体の「Word」を「ワード」に置き換える処理を行います。Find オブジェクトの実行例
With WrdDoc.Content.Find .Text = "Word" '置換元の文字列 .Replacement.Text = "ワード" '置換後の文字列 .Wrap = wdFindContinue '検索折返し指定 '(文書の途中から検索し、最後に到達した時に先頭から続行) .Execute Replace:=wdReplaceAll End With
基本的にはこの処理を複数の文字列の置換が出来る様に以下の様な関数にしました。
関数の引数としては置換される文字列と、置換文字列を配列で指定します。 尚、vba では配列の場合は Variant 型として宣言します。 置換される文字列配列と、置換文字列配列の個数のチェックは行っていないので、同じにする必要があります。
この関数での注意点は、置換文字列の中に改行を含んでいる場合に、そのまま一括で置換してしまうと 1個目の改行以降が左側に寄ってしまいます。そのため、改行で文字列を分解し、1個ごとに文字列と改行を出力する様にしています。
こうすることで、置換元の位置の左端に合わせた感じで改行後の文字列が揃うはずです。
Word文書文字列置換関数
'****************************************************************************** ' Word文書文字列置換処理 '****************************************************************************** ' 関数名 : WordReplace() ' 引数 : P_vaKey() '差替KEY文字列の配列 ' : P_vaVal() '差替文字列の配列 ' : P_blnCrLfLeftAlign '左揃えフラグ '****************************************************************************** Public Sub WordReplace(P_vaKey() As Variant, P_vaVal() As Variant, P_blnCrLfLeftAlign As Boolean) On Error GoTo Err_WordReplace Dim i As Integer For i = 0 To UBound(P_vaKey) If InStr(P_vaVal(i), vbCrLf) = 0 Or P_blnCrLfLeftAlign = False Then '置換文字列に改行コードが無い場合、または左揃えフラグがOFF '文字を検索、置換する With WordDoc.Content.Find .Text = P_vaKey(i) .Forward = True .Replacement.Text = Replace(CStr(P_vaVal(i)), vbCrLf, vbCr) .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Else '置換文字列に改行コードがある場合 '検索文字列の先頭にカーソル移動 With WordApp.Selection.Find .Text = P_vaKey(i) .Execute End With '文字を検索、置換する With WordDoc.Content.Find .Text = P_vaKey(i) .Forward = True .Replacement.Text = "" '取り敢えずクリア .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Dim arr() As String arr = Split(P_vaVal(i), vbCrLf) '改行で分解した文字列をカーソル位置から順次出力 Dim ix As Integer For ix = 0 To UBound(arr) If ix > 0 Then '2個目以降は改行出力 WordApp.Selection.TypeText vbCr End If WordApp.Selection.TypeText arr(ix) Next ix End If Next i Exit_WordReplace: Exit Sub Err_WordReplace: MsgBox Err.Description Resume Exit_WordReplace End Sub
この関数をWord処理用クラスに追加して、それを使用する例として、access フォームに1個のボタンのみを設置し、そのクリックイベントでワード文書を開く様にしてみます。
Word文書文字列置換関数の使用例
Option Compare Database ' クラスWordオブジェクト Private mclsWord As clsWord '------------------------------------------------------------------------------ ' フォームロード時イベント '------------------------------------------------------------------------------ Private Sub Form_Load() Set mclsWord = New clsWord End Sub '------------------------------------------------------------------------------ ' フォームクローズイベント '------------------------------------------------------------------------------ Private Sub Form_Close() 'ワードクローズ mclsWord.WordClose 'Wordオブジェクト解放 Set mclsWord = Nothing End Sub '------------------------------------------------------------------------------ ' コマンド1開始 '------------------------------------------------------------------------------ Private Sub コマンド1_Click() Dim strPath As String 'ワードファイルを読み込み、文章を編集する状態にする strPath = Application.CurrentProject.path & "\" & "find-test.docx" 'ワードファイルを読込み編集状態で表示する mclsWord.WordOpen strPath, True ' Dim arrVaKey() As Variant Dim arrVaVal() As Variant arrVaKey = Array("@test1@", _ "@test2@", _ "@test3@", _ "@test4@") arrVaVal = Array("テスト1", _ "テスト2", _ "テスト3", _ "テスト4-1" & vbCrLf & "テスト4-2" & vbCrLf & "テスト4-3") '置換処理(左揃えを行わない) mclsWord.WordReplace arrVaKey, arrVaVal, False arrVaKey = Array("@test5@") arrVaVal = Array("テスト5-1" & vbCrLf & "テスト5-2" & vbCrLf & "テスト5-3") '置換処理(左揃えを行う) mclsWord.WordReplace arrVaKey, arrVaVal, True End Sub
「コマンド1開始」を押下することで、ワードが起動し置換処理の結果が表示されます。 元のワードの文書と結果の文書は以下の画像の様になります。 左揃え処理を行う個所と、行わない個所の違いが分かると思います。
関連する記事
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
⇒access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
⇒access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)