無限不可能性ドライブ

『ニューラルネットワーク自作入門』に刺激されてExcelVBAでニューラルネットワークを作ってみたものの、やっぱり数学やらなきゃと思い少しずつやってきたのもあって、自分の知識の整理とかそういった感じです。

【VBA】文字列検索【GAS】

某所でのお題を若干改変して「スプレッドシートから特定の文字列を検索してそのアドレスを出力する処理」としてみました。
この表の中から「Excel」という文字列を探して、アドレスを出力します。
GASの勉強という側面もあるので、Findとかは使わずに地味に For で回す処理にしてあります。

f:id:celaeno42:20181109233420p:plain

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も同じ書き方ですが、どうもこのラベルの使い方は慣れないです…