• ベストアンサー
  • すぐに回答を!

エクセルVBAの勉強初歩のものです。

エクセルVBAの勉強初歩のものです。 今A列に社名、B列に住所、C列に業務内容と記載されています。データは今のところ十数行です。フォームのテキストボックスでキーワードを入れて、検索ボタンを押して、A列の社名で検索してヒットすれば、社名、そのセルの右隣(B列)、その又右隣(C列)のセルの内容をフォームのテキストボックスに表示しようというものです。以下はソースの一部です。 '検索範囲設定 With Worksheets("sheet1").Range("A2:A" & Rows.Count) If (flag = False) Or (firstRange Is Nothing) Then    '初めての検索処理 '初めての検索処理 Set c = .Find(What:=myKey, After:=.Cells(.Count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) '最初の検索で見つからなければ、 If c Is Nothing Then MsgBox "データは見つかりません", vbExclamation Exit Sub '最初の検索で見つかれば Else (1) d = c.Address (2) Set e = d (3) Debug.Print d.Value (1)でヒットしたセルのアドレスをD(stringで定義)してそのまま、offset(0,1).valueとしようとしたのですが、offsetはオブジェクトでないと使用できないとの事。 だったら、eをオブジェクトで定義(dim d as object)として実行したら、= dで型が一致しませんとエラーがでました。 やりたいことは、A列で検索したセルのアドレスの把握はできているので、その右隣、そのまた右隣のセルのアドレスを取得する方法です。 もう一つやりたいことはその把握したセルのアドレスに記載されている情報を取得する方法です。(3)でも型が一致しませんとエラーが出ました。てっきり、 textbox1 = d.valueなんて感じでできるのだと思っていましたが。 おそらく方向としては間違っていないのでしょうけど、どなたか間違いと改善方法をよろしくお願いたします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数168
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2
  • tom11
  • ベストアンサー率53% (134/251)

Private Sub CommandButton1_Click() Dim r As Range Dim rin As Range Set r = Sheet1.Range(Cells(2, 1), Cells(2, 1).End(xlDown)) Set rin = r.Find(Trim(TextBox1.Text)) TextBox2.Text = rin.Offset(, 1) TextBox3.Text = rin.Offset(, 2) End Sub サンプルをアップします。テキストボックス1に社名を入れて 検索図を、アップします。 後は、自分で、応用してください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

画面まで用意してくださったtom11さん、ありがとうございました。理解できました。私のは、rin.Offset(, 1)を代入するオブジェクト、この場合はテキストボックスが無く、本来なら、textbox1 = rin.Offset(, 1)とするところを、私のでは、1、textbox1というオブジェクトを用意していなかったので、エラーとひょうじされたこと、2、cがすでにrangeobjectということをマッタク知識としてなかったことです。この2点を吸収できて理解できました。

関連するQ&A

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

    エクセルVBA初心者です。 「テキストボックスとコマンドボタンを使って、シートのA列にあるセルの文字列を左から検索する」という事をやりたいのですが、うまくいきません。お教えください。ちなみにCtrl+Fではなく、VBAで。 Private Sub TextBox1_Change() Dim R As Range With ActiveWorkbook.Worksheets("Sheet名") Set R = .Columns(3).Find(Me.TextBox1.Value) End With If R Is Nothing Then MsgBox "該当セルなし" Else R.Activate End If Set R = Nothing End Sub としましたが、テキストボックス入力+Enterで出来てしまい、コマンドボタンが機能しません。また、BackSpaceやDelをすると、他のセルに飛んでしまいます。????

  • Excel VBAを使った重複行の抜き出しについて教えてください

    以下のような2シートから、重複する「商品番号」のあるsheet1の行を抜き出して、別シートに書き出したいと思っております。 sheet1  |  A   |  B   | C -+--------+-------+----- 1|      |      | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3|  123456|  ガム|山田太郎 -+--------+------+-------- 4| 2345678| チョコ|田中花子 ・・・ sheet2  |  A   |  B   | C -+--------+-------+----- 1|      |     | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3| 3987624|     | -+--------+------+-------- 4| 193678|      | ・・・ そこでVBAを作成したのですが、例えば商品番号「222011001」の行を抜き出したいのに、「22011001」の行も一緒に抜き出してしまいます。 どこがいけないのか、教えて頂けないでしょうか。 作成したVBAは以下の通りです。 VBA初心者で本を見ながら作ったため、大変見にくくなっているかと思います。申し訳ありませんが、どなたかおわかりになる方がいらっしゃいましたら、どうぞ宜しくお願い致します。 Option Base 1 Option Explicit Sub 重複データ抽出書き直し() Dim シート(2) As Worksheet Dim 比較列(2) As Integer Dim 一致セル As Range Dim 検索範囲 As Range Dim i As Integer Set シート(1) = Sheets("sheet1") Set シート(2) = Sheets("sheet2") 比較列(1) = 1: 比較列(2) = 1 シート(2).Activate ActiveCell.CurrentRegion.Select Selection.Offset(1, 比較列(2) - 1) _ .Resize(Selection.Rows.Count - 1, 1) _ .Select Set 検索範囲 = Selection Sheets.Add After:=Sheets(Sheets.Count) シート(1).Activate ActiveCell.CurrentRegion.Select Selection.Resize(1).Copy With Sheets(Sheets.Count).Range("A1") If Application.Version >= 9 Then .PasteSpecial 8 End If .PasteSpecial End With For i = 2 To Selection.Rows.Count Set 一致セル = 検索範囲.Find(Selection.Cells(i, 比較列(1)).Value) If Not 一致セル Is Nothing Then Selection.Offset(i - 1).Resize(1) _ .Copy Sheets(Sheets.Count) _ .Range("A65536").End(xlUp) _ .Offset(1) End If Next i Sheets(Sheets.Count).Activate End Sub

  • セルにワイルドカード*を含む式を書き込むには?

    下記コードはアクティブセルの右にアクティブセルと同じ値を書き込みますが、 ワイルドカード付きの値を書き込むにはどうすれば良いのでしょうか? n列  (n+1)列 あ     あ* い     い* う     え* ______________________________ Sub test1() Dim R As Range, R1 As Range Set R = ActiveCell Set R1 = Range(R, Cells(Rows.Count, R.Column).End(xlUp)) With R1.Offset(, 1) .Formula = "=" & R.Address(0, 0) End With Set R1 = Nothing: Set R = Nothing End Sub

その他の回答 (2)

  • 回答No.3

>おそらく方向としては間違っていないのでしょうけど・・・・ 方向とは何を指しているのかは分りませんが それよりも基本的なところの問題です objectの意味が理解出来ていません ヘルプから、findの検索結果はRangeObjectで返されるとあります では、RangrObjectとは セルの場所、値、色、文字のフォント、文字の色、文字の大きさ 書式・・・・・など、セルを構成している要素の集まりです セルの各要素の取出す方法として RangeObjectの後に要素名(プロパティ)で取出すことが出来ます 場所=Range("A1").Addres 値=Range("A1").Value 文字の色=Range("A1").Font.Color などなど 要素も取出されてしまうと、ただのデータ(文字列、数値など)です 質問に有る下記の一部分はエラーになることが分ると思います >(1) d = c.Address cと言うRangeObujectからAddress要素を取出して dへ代入されているので、dはRangeObujectでは無く文字列です >(2) Set e = d SetはObjectを変数に代入するためのコマンドです Object変数eへ文字列を代入しようとしているので 型が一致しないと怒られます >(3) Debug.Print d.Value これも、文字列に要素、値は存在しないので オブジェクトが無いと怒られます この辺を理解できれば、御自分で修正できると思いますよ 参考まで

共感・感謝の気持ちを伝えよう!

質問者からのお礼

silverfdさん、オブジェクト、range、型に関して詳細にご説明いただきありがとうございました。理解できました。もっと注意深くステップを踏んでゆきます。変更したソースではtom11さんの例とrange(d)・・・の両方を使わせていただきました。ありがとうございます。

  • 回答No.1

>(1)でヒットしたセルのアドレスをD(stringで定義)してそのまま、offset(0,1).valueとしようとしたのですが、offsetはオブジェクトでないと使用できないとの事。 だったら、eをオブジェクトで定義(dim d as object)として実行したら、= dで型が一致しませんとエラーがでました。 cは最初からRangeObjectなわけですよ、c.offset(0,1).value(CはObject)で読めるものを、何でわざわざdを使ってd=c.address(adressはString型)に変換して読めなくしているの?しかも、それ(d=string型=ただの文字列)をただ”=”(イコール)で何もしないでeオブジェクトにきるわけがないでしょう。dは、ただの文字列(例えば、"$A$5"という文字)ですよ。dをaddressとしてcのアドレスを取得してそれを使うなら、range(d)でこれがRangeObjectですから、dを使いたいならrange(d).offset(0,1).value。あと、別途eを使いたいなら、set e=Range(d) もうひとつやりたいこと、の方ですが、「 dで型が一致しませんとエラーが」がパスしない以上、通るわけがないんですが。で、上記で通るようになれば、textbox1=range(d).valueとかでできるはずです。無論d.valueなんていう表現をシステムは理解できませんので(何度も言いますが上記ではdはただの文字列であり、セルの取得なんてそのままでは絶対にできない)TextBoxに表示できるものはなく、エラーになります。 全体的に、文法のレベルと理解のレベルが合っていません。withなんてもっと慣れてから使えばいいと思います。型については、ほとんど理解できていないレベルです。変に(無理に)変数を使う前に、極力そのまま理解しやすい形でコーディングをして、もっと慣れてから変数を利用した方が、上達すると思いますよ。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

hige_082さん、silverfd同様、オブジェクトに関して詳細にご説明いただきありがとうございます。私のこれまでのオブジェクトの知識は浅かったので、更に深くなりました、ありがとうございました。 ご解答いただいたみなさま、お忙しい中、ホントウにありがとうございました。

関連するQ&A

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

    エクセルVBA初心者です。 a1   3   5 a2   2   7 a3   1   7 a4   3   1 上で例えると、求めたい値は3*5+2*7+1*7+3*1=39です。  a1という文字を検索し、そして(a1の隣のセル)*(a1の隣の隣のセル)  次に (a2の隣のセル)*(a2の隣の隣のセル) と言う風にくりかえし、  最後に今まで乗算してでた値を合計してセルに結果を入力させるマクロなのですが、  エラーが何度も出て修正してはいるのですが、もうお手上げ状態です。   #以下がそのマクロです。 Sub マクロ() Dim fCell As Range, fAdr As String Dim a() As Double Dim i As Integer, j As Integer i = 0 j = 0 Set fCel = Cells.Find(What:="a1", LookAt:=xlWhole) If Not fCell Is Nothing Then Do While fCell.Offset(j, 0).Address <> fCell.End(Direction:=Down).Address j = j + 1 Loop ReDim a(j) As Double fAdr = fCell.Address For i = 0 To (j - 1) a(i) = fCell.Offset(0, 2).Value = fCell.Offset(0, 1).Value * fCell.Offset(0, 2).Value a(5) = a(5) + a(i) Next i fCell.Offset(j + 1, 1).Value = a(5) Else End If End Sub 本当に初心的なことだと思いますが、どうかよろしくお願いします。

  • エクセルVBAを勉強し始めたものです。多くの方にここで教えを請いながら

    エクセルVBAを勉強し始めたものです。多くの方にここで教えを請いながら日々少しづつ勉強しています。ありがとうございます。 (2) With Worksheets("sheet1").Range("A2:A" & Rows.Count) If (flag = False) Or (firstRange Is Nothing) Then Range("A2:A" & Rows.Count).Interior.ColorIndex = xlColorIndexNone (1) Set c = .Find(What:=myKey, After:=.Cells(.Count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) ギモン1 上記のプログラムですが、あるプログラムの一部分です。(1)のAfter:=.Cells(.Count), はどういう意味なのでしょうか。 afterは指定したセルの次から、という意味と書いてありました。 ギモン2 =.Cells(.Count),cellsと.countの.は(2)の With Worksheets("sheet1")と関連性があるのでしょうか。 ギモン3 .Cells(.Count),どうやって次のセルを指定しているのでしょうか。 よくわからないので、教えていただけますよう、よろしくお願いします。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • EXCEL VBAで・・・。

    テキストボックス34に入力した値を、ExcelのA列の値より検索し その隣の値をテキストボックス4に表示させる、と言う処理をしています。 検索時に検索データが見当たらない場合、メッセージボックスを表示し、 更に、テキストボックス34のデータを消去→テキストボックス34にフォーカス移動 させたいのです。 下記のコードですと、メッセージボックス表示と テキストボックス34のデータ消去までは出来るのですが フォーカス移動してくれません。 イベントをexitにしている理由は特にないのですが、changeを使うと、 テキストボックス34に1文字入力された時点でメッセージボックスが表示されたり、 1文字でも一致するデータが順に表示されてしまいます。 (テキストボックス34に入力するデータの文字数は3文字固定です。) 何か良いお知恵がありましたら、お教え下さい。 ----------------------------------------------------------- Private Sub Textbox34_exit(ByVal Cancel As MSForms.ReturnBoolean) Dim Result As Variant Set Result = Range("A:A").Find(what:=TextBox34.Text, MatchCase:=True, matchbyte:=True) If Result Is Nothing Then MsgBox ("入力されたコードは登録されていません。") TextBox34.Text = "" TextBox34.SetFocus Else Range("A:A").Find(what:=TextBox34.Text, MatchCase:=True, matchbyte:=True).Activate ActiveCell.Offset(0, 1).Select TextBox4.Text = ActiveCell.Value End If End Sub

  • エクセル VBA 検索 スクロール

    お世話になります。 A列に製品名、B列に場所と詳細を表した表です。 E1に製品名を入れて検索ボタンを押すと右隣のセルの値がE1に表示され検索件数がMsgBoxに表示されるものをこのページで聞いたりしながら作りました。 'Dim 対象セル As Range 'Dim 最初のセル番地 As String 'Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub Set 対象セル = Range("A2:A1287").Find(What:=Range("E1").Value, After:=Range("A1287"), lookAt:=xlWhole) If 対象セル Is Nothing Then Exit Sub 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Range("A2:A1287").FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 Range("E3").Value = 対象セル.Offset(, 1).Value MsgBox "検索件数は" & 検索件数 & " 件です" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub 今回質問したいのは検索したセルを含む行(製品名によって複数あります)を自動で一番上、A5でウィンドウの固定をしてあるのでA6からの表示になるようにスクロールするにはどのようにしたらいいでしょうか?よろしくお願いします。

  • エクセルのVBAコードにつてい

    以下のコードについて、その内容をまだ自分の知識では理解できず困っておりまして、アドバイスいただければと思いまして書き込みました。 『コード』 Sub Test() Dim Lc As Integer Dim Ct As Integer Dim MyR As Range Dim C As Range Dim D As Range Lc = Range("A1").End(xlToRight).Column - 2 For Each C In Range("B2", Range("B65536").End(xlUp)) Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc)) If Ct > 0 Then Set MyR = C.Offset(, 1).Resize(, Lc).SpecialCells(2, 1) For Each D In MyR With Sheets("Sheet2").Range("A65536").End(xlUp) .Offset(1).Value = C.Value .Offset(1, 1).Value = Cells(1, D.Column).Value End With Next Set MyR = Nothing End If Next With Sheets("Sheet2") .Columns("A:B").AutoFit .Activate End With End Sub 『質問』 1.「Lc = Range("A1").End(xlToRight).Column - 2」の部分の解釈は「A1から右方向に一番最後のセルまでを範囲指定し、その一番右のセルの列番号を取得する」変数という解釈でいいのか 2.「Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc))」の部分の変数はどういった値の整数を取得する変数なのか 以上2点についてアドバイスいただけると幸いです。

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

  • エクセルVBAを勉強中の者です。

    エクセルVBAを勉強中の者です。 今、あるソースを書いていて、それなりに上手くいったので、仮で、これまで、 dim e as string と宣言していたのを、eをdataaddress1に変更して、ソース中のeも全て、dataaddress1に変更しました。以下は途中のソースです。変更まではソースは正常に作動していました。 Range("B2:B" & Rows.count).Interior.ColorIndex = xlColorIndexNone '初めての検索処理 Set data1 = .Find(What:=myKey, After:=.Cells(.count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) '最初の検索で見つからなければ、 If data1 Is Nothing Then MsgBox "データは見つかりません", vbExclamation Exit Sub '最初の検索で見つかれば Else dataaddress1 = data1.Address TextBox1.Value = Range(dataaddress1).Value TextBox2.Value = Range(dataaddress1).Offset(0, 1).Value 分類.Value = Range(dataaddress1).Offset(0, 2).Value データ番号.Value = Range(dataaddress1).Offset(0, -1).Value dataaddress1に変更したとたんに、実行時エラー1004 Rangeメソッドは失敗しました'Globalオブジェルト"というメッセージがでました。 何か、stringでの変数の宣言の仕方に問題があるのでしょうか、ご存知の方教えて下さい、よろしくお願いします。

  • エクセルVBAのSETステートメントについて

    マクロを組み込んだエクセルファイルが完成したのですが、ファイルサイズが大きくなってしまった ため、ファイルサイズを軽くするために現在 試行錯誤を繰り返しています。(シート数:50シート) ファイルサイズを軽くするために今までに取り組んできたのは下記の9項目です。 ・数式を値に変換 ・シートイベントプロシージャをThisWorkbookイベントに変換してマクロ構文を簡素化 ・隠れオブジェクトを全て削除(オブジェクト数を最小限・最小サイズに抑える) ・条件付書式、入力規則、名称登録を最小限に抑える ・必要な条件付書式のセル番地には必ず 『 $ 』 を付ける ・Offset 構文を最小限に抑える ・未使用セルの削除(最終セルの位置を正常化) ・Call マクロを多用してマクロ構文の情報量を極力減らす ・型に応じた変数宣言を徹底(バリアント変数扱いを最小限に抑える) ただ、『 型に応じた変数宣言 』 のSETステートメントの正しい使い方について私自身が良く理解 をしていないためにご指導を頂きたく投稿をさせて頂きました。不明なのは下記の2点です。 (1)『 SET a = ○○○○ 』 はオブジェクト型変数に対してのみ使用するものなのでしょうか?   データ型(Date)や文字列型(String)の変数に対してはSETステートメントは使用しないもの   なのでしょうか?仮にデータ型や文字列型変数に対してSETステートメントを使用した場合の   メリットとデメリットについて教えて下さい。もしかして、データ型や文字列型の変数の場合は   ただ単純に 『 SET 』 の文字が省略されているだけなのでしょうか。この基本的な部分の   理解ができていないので、理屈が分からずに困っております。 (2)『 SET a = Nothing 』 の対応はどこまで必要なのでしょうか?   上記(1)の質問にも絡むのですが、メモリリソースを開放してファイルサイズを軽くするためには   『 SET a = Nothing 』 が有効であるという情報がインターネット上に多数掲載されてますが   データ型や文字列型変数に対してもプロシージャの末尾に 『 SET a = Nothing 』 の構文   を付け加えた方がファイルサイズが軽くなるものなのでしょうか?   また、下記マクロ処理の場合にも 『 SET a = Nothing 』 の構文は必要なのでしょうか?        'Shをオブジェクト型変数として宣言     Dim Sh As Worksheet           :           :     '全てのシートに対して以下の処理を実行     For Each Sh In Worksheets            固有のシートに対してではなく全てのシートに           :                      対してマクロを実行する処理においても           :                      末尾に 『 SET a = Nothing 』 の構文を     '次のブックに対しても同様の処理を実行   付け加えた方がファイルサイズが軽くなる     Next Sh                        ものなのでしょうか? とにかく、正攻法でファイルサイズを軽くする方法を探しています。コメントが長くなり過ぎてしまい ましたが、『 SETステートメントの正しい使用方法 』、『 ファイルサイズを軽くするための裏技 』 などについて、ご存知の方がいらっしゃいましたら是非教えて頂けますよう宜しくお願いします。

  • vbaで文字列の件

    お世話になります。 エクセルVBAで、文字列の右から何文字列目以降を 緑色に着色したいのですが、どうしたら良いか分かりません。 offsetで隣のセルに切り出してから着色とかは出来たのですが・・、 どなたかご教授下さい。 宜しくお願い申し上げます。