• ベストアンサー

EXCEL VBAの構造体検索について

エクセルVBAを友人に頼まれ修正しているのですが、 構造体内検索ができません。 ネットを検索しても解決にはつながらなかったので質問させていただきました。 excelは2010、OSはwindows8です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.5

#既に種々の回答が付いていますが、お示しのコードの「図」を拝見して考えられることを少し。 ●1)先ず、「p=array.indexof(str,"い")」のところが赤くなっていますが、これはコンパイルエラーですよね。  「array」という言葉は予約語(Array 関数)であるため、変数としては使えないはずです。  試しに、「Dim array as Object」などと書こうとすると、「array」の部分が選択された状態で、「コンパイルエラー: 修正候補: 識別子」と表示されます。 http://officetanaka.net/excel/vba/error/compilation_error/error_3.htm ●2)次に、「indexof」という関数自体についてですが、 Sub Macro1()   Dim myAL As Object   Set myAL = CreateObject("System.Collections.ArrayList")   For i = 1 To 3     myAL.Add Mid("あいう", i, 1)   Next i   p = myAL.indexof("い", 0) + 1   MsgBox p & "番目" End Sub みたいな使い方なら動かすことはできなくはありません。  しかし、pucho3338 さんがお示しのコード p = indexof(str, "い") に書かれているような、第1引数が「配列」、第2引数が「配列の要素」となるっているものが、どの言語の [IndexOf メソッド] なのかが判りかねます(言語によって引数の数や種類が異なる)。 http://social.msdn.microsoft.com/Search/ja-JP?query=indexof&ac=4  しかも、次行には、 p = array.indexof(str, "い") というように、関数の前にオブジェクト(array)が配置されていますが、(1)で書きましたように、この行も動かないはずです。  この2行を拝見しただけでも、まともに動くコードとは思えませんので、これは、「友人に頼まれ修正」する前のコードではなくて、pucho3338 さんご自身が、修正時点でつまづかれたところだけを抜き書きされたコードではないかと存じますが、いかがでしょうか? ●3)この「コンパイルエラー: Sub または Function が定義されていません。」エラーが出ないようにするためには、下記のいずれかの処置がされている必要があるかと存じます。   ・何かのライブラリに参照設定を施す。   ・[CreateObject 関数] で ActiveX オブジェクトへの参照を作成する。   ・別途、下記のようなユーザー定義関数が定義されている。 Function indexof(myArr, element)   For i = 0 To UBound(myArr)     If myArr(i) = element Then Exit For   Next   indexof = i + 1 End Function ●4)しかし、 p = array.indexof(str, "い") という書き方から見ると、求める「p」は「2」ではないかと存じますが、その「答え」が欲しいだけでしたら、わざわざ関数を作らなくても、 p = Application.Match("い", str, 0) でイケルかと存じますが、実は、「IndexOf メソッド」だけではなくて、「Sort メソッド」や「Contains メソッド」などが使いたいというようなことでしたら、 http://social.msdn.microsoft.com/Search/ja-JP?query=arraylist&refinement=108%2C117&ac=4 に検索された「ArrayList クラス」を使うことになろうかと存じます。

pucho3338
質問者

お礼

回答ありがとうございます。 説明不足でした、すみません。 私が p = array.indexof(str, "い") で欲しかった値は str の中にある "い"の番号(何番目)です。 For文やIfを使えば割り出せるんですが、なんとか1文で出来ないか、できるはず!って思った為質問しました。 もともと.Netでの開発をしていたので「できるはず!」って思ったのかもしれません。 DOUGLAS_さんの p = Application.Match("い", str, 0)で欲しかった答えが出ました。 Application.Matchという方法があるなんて知りませんでした。 ベストアンサーにさせていただきます。

その他の回答 (4)

回答No.4

VBAだから、DOT NET の関数やオブジェクトは使えません。 与えられた文字列配列の中から参照文字列を検索して、要素位置を返す関数を作ってください。 Private Function ArraySearch(arrStr() as string, refStr as String) As integer Dim posL As Integer Dim posU As Integer Dim pos As Integer posL = LBound(arrStr) posU = UBound(arrStr) ArraySearch = -1 For pos = posL To posU If arrStr(pos) = refStr Then ArraySearch = pos End If Next pos End Function ※テキストエディタ上で書いたので、ステートメントや関数が間違っているかも知れません。

pucho3338
質問者

お礼

確かに For文、IF文の組み合わせで検索できますが、面倒なので1文くらいで検索できないかなー?と思ってました。 回答ありがとうございます。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

Access2010のVBAのヘルプだと Execute メソッド、Requery メソッド、および Clear メソッドの使用例 (JScript) が載っていました。 もしかしたら、ツール→参照設定の、Microsoft_JSCriptにチェックを入れれば使えるようになるかも。 少し関係ありそうな?処 http://iphone-dev.doorblog.jp/archives/26337466.html もし、JSCript を使っているのがここだけなら 参照リンク先にもあるようにFor ~Next でループして探しても・・・と思います。

pucho3338
質問者

お礼

参照の追加でどうにかなるだろうと思ってましたがダメでした。 VB.Netで出来たので、マクロでもできると思ったんですが。。。 回答ありがとうございます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

No1です。 あとの可能性としてはユーザー定義関数を 削除(あるいは未作成・未コピペ)したとか??? どっちにしても修正元がどうなっているのか その友人に詳しく聞いてみないと。。。。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

画像が良く見えないけどVBAでは .NET FrameworkのArray.IndexOf メソッド http://msdn.microsoft.com/ja-jp/library/system.array.indexof(v=vs.80).aspx は使えないのでは? 中には使えるものもあるみたいですが。 .NET Frameworkを使う http://officetanaka.net/excel/vba/tips/tips98.htm ⇒検証していないけどArrayListだと使えるかな?

pucho3338
質問者

お礼

Array.IndexOf は使えないんですね。 もともと.netで開発していた者で、 「構造体内の検索くらいできるだろう!」って考えがあったので・・・ 回答ありがとうございます。

関連するQ&A

  • Excel VBA内の記述での検索

    Windows7とWindows8環境でExcel2010を使っています。 現在表の最終行を求めるために Cells(Rows.Count, 1).End(xlUp).Row というコードを書いていますが、過去のファイルには Range("A65536").End(xlUp).Row などで最終行を求めているファイルがたくさんあります。 私が作成したファイルばかりではないため、久しぶりにファイルを開いて初めて気づき、その都度修正はしていますが、時間に追われている仕事の場合は修正作業にかかる時間もバカになりません。 ですので、暇をみて一度に修正してしまおうとおもうのですが、どのファイルが昔の記述をしているのか見つけることができません。 Windows標準のテキスト検索では見つけることができないので、なにかフォルダ内のExcelファイルのVBAの記述を全文検索できるような方法やツールはありませんか?

  • ExcelをVBAで読み込むと

    ExcelデータをAccess VBAを使い、読み込んでテーブルに溜め込んでいます。 問題が1つあり、Excelのデータは他のシステムによって自動で作られています。 このExcelデータは1行目に見出しがあります。この見出しの列が時々追加されたり、削除さたりします。 例えば、下記の2列があるとします。読み込みたいのはID,NAMEのみです。 ID,NAME この2列が固定であれば、問題ありません。しかし、時々、 ID,SEIBETU,NAME と、SEIBETUという項目が追加されたりします。そうすると、Access VBAで読み取ろうとするとエラーが出ます(プログラムの修正をすればいいのですが)。 こういった問題を解決するには、何かいい方法はあるでしょうか?Accessでやっていますが、VB.NET、SQL Serverで解決できるなら、そちらを勉強して解決したいと思います。 よろしくお願いします。

  • エクセルVBAでVBAの修正は出来るのでしょうか?

    エクセルVBAでVBAの修正は出来るのでしょうか? あるエクセルファイルにマクロを組み込んでいます(ユーザーフォームも使用)。 このエクセルファイルを複数個フォルダ内にコピーしています。 このコピーした全てのファイルのマクロの修正をVBAで出来ないかと考えています。 修正箇所はモジュール内のコード修正、モジュールの追加、既存のユーザーフォームにボタン等の追加等です。 エクセルは2003を使用しています。 どなたか教えてください。

  • Excelの文字を検索させるVBA

    毎日検索するワードがあるので、IEにあるgoogleツールバーにExcelの文字列を代入してタブ毎に検索結果を表示または、Excelに取り込みたいと思います。 このような事はVBAを使えば可能なのでしょうか? 抽象的な質問で恐縮ですが、おわかりの範囲でお教えください。 バージョンはExcel2003です。

  • Excelを起動する際にエラーがでます

    Excelを起動する際に次のようなエラーが出ます。 「このファイルのVBAプロジェクトを開くには、現在インストールされていないコンポーネントが必要です。詳細については、Office.comで「VBAコンバーター」を検索してください。」 Office.comで検索して、修正プログラムをインストールしましたが、解決できませんでした。 Excelのバージョンは2010で、OSはWindows7です。 解決方法をご存じの方、よろしくお願いします。

  • エクセルVBA

    同じエクセルVBAで組んだプログラムなのですが、 修正した時 実行できるPCと「型が違います」とエラーが でるPCがあります。 エクセルの設定等で何かが違うのでしょうか?

  • エクセルVBAがMACで動かない

    WINDOWSで開発したVBAがMAC(マック)で動かない(コンパイルエラーが起こる)という現象が起こっています。 ネットで検索していて「VBAがMACで動かないことがある」ということは認識しているのですが、 ・MACで動かすことは可能か ・動くようにするには、どうすればよいか(コードを変更する、EXCELのバージョンを変える等) の2点について教えていただければと思います。 <バージョン> OS MAC 9.1  EXCEL バージョン 「MAC EXCEL 2001」 <エラーメッセージ> SUBまたはFUNCTIONが定義されていません。 <VBA内容> エクセルシートの文字列をカンマ区切りでテキストファイルに吐き出すだけです。 一部でもお答えいただけると助かります。よろしくお願いします。

  • エクセルVBAで検索

    エクセルのVBAで文字の検索をしたいと思います エクセルは2000です エクセルのマクロの記録機能を利用して 下記のようなマクロを作成しましたが これでは、別のシートの文字が検索できません 同一ブックの別のシートも検索できるようにするには どうしたら良いでしょうか、よろしくお願いします 以下同一シートしか検索しない例 Sub Macro1() Dim 検索文字 As String 検索文字 = InputBox("検索文字を入力してください") Cells.Find(What:=検索文字, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _ .Activate End Sub

  • エクセル2010のvbaについて

    エクセル2010のvbaについて質問です 選択した画像の大きさ(ピクセル)を取得したいです 検索してもあまりわからなかったので 回答お願いします

  • 初心者です!エクセルVBAで

    初心者です!エクセルVBAでアクセスのデーターを修正したいのですが。 初心者です!エクセルVBAでアクセスのデーターを修正したいのですが。 データーがテキスト型を空にするには rs!Field1 = "" でいけるのですが 数値型だとエラーが出てしまいます。 フィールドを空文字にしたいのですが・・・

専門家に質問してみよう