【VBA】文字列検索【GAS】
某所でのお題を若干改変して「スプレッドシートから特定の文字列を検索してそのアドレスを出力する処理」としてみました。
この表の中から「Excel」という文字列を探して、アドレスを出力します。
GASの勉強という側面もあるので、Findとかは使わずに地味に For で回す処理にしてあります。
【VBA】
Option Explicit Public Sub textSearch() Dim vRange As Range Dim r As Long Dim c As Long Dim searchText As String Dim res As String searchText = "Excel" Set vRange = ActiveSheet.UsedRange res = "" For r = 1 To vRange.Rows.Count For c = 1 To vRange.Columns.Count If Cells(r, c).Value = searchText Then res = Cells(r, c).Address GoTo BREAK End If Next Next BREAK: If res = "" Then Debug.Print "文字列「" & searchText & "」は見つかりません。" Else Debug.Print "文字列「" & searchText & "」は[" & res & "]にあります。" End If End Sub
特段特別な書き方はしていません。
唯一、二重の For から一気に抜けるために GoTo を使っていることくらいでしょうか。
(他の言語の break 文をイメージ)
【GAS】
function textSearch() { var sheet = SpreadsheetApp.getActiveSheet(); var values = sheet.getDataRange().getValues(); var res = ''; var searchText = 'Excel'; LABEL: for (var i=0; i<values.length; i++) { for (var j=0; j<values[i].length; j++) { if (searchText == values[i][j]) { res = sheet.getRange(i + 1, j + 1).getA1Notation(); break LABEL; } } } if (res == '') { res = '文字列「' + searchText + '」は見つかりません。' } else { res = '文字列「' + searchText + '」は[' + res + ']にあります。' } Logger.log(res); }
こちらも二重ループから一気に抜けるためにラベルを使っています。
Javaも同じ書き方ですが、どうもこのラベルの使い方は慣れないです…