質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

579閲覧

VBAでfindを使った後、その行で最終列を求める方法

syo110

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

0クリップ

投稿2020/04/30 14:03

編集2020/04/30 23:29

VBAでfindを使った後、その行で最終列を求める方法

作りたいもの

VBA始めたての初心者です(ほかの言語は経験ありです)
組織の都合でVBAを使わなくてはいけなくなり勉強をはじめました。
今、作業場所を管理するプログラムを作っていまして、実際のプログラム自体は完成したのですが作業場所ごとにいつどのように使われたかを管理する機能をつけようと考えました。活動場所には番号が割り振られており、それがA列に一覧で書かれています。これの横に作業ごとに割り振られている管理番号を順々に連ねていきたいといった状況です。

今の状況

今この下にあるようなコードを書きました。組織の情報が含まれるので質問部分だけで申し訳ありません。ほかに必要な部分があればおっしゃってくだされば追記します。
placenumがA列に書かれている場所に振られている番号で,gronumが作業ごとに割り振られている管理番号です
実行したところ「実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです」
というエラーが出てきます。
エラーが出る箇所は下のコードで5行目、lastcolumn=....のところです。

コード

Visual

1 Dim i,placenum,gronum 2 '途中省略 3 With Worksheets(5) 4 Set i = .Columns(1).Find(placenum, SearchOrder:=xlByColumns).Rows 5 lastcolumn = Worksheets(5).Cells(i, Columns.Count).End(xlToLeft).Column 6 .Cells(i,lastcolumn + 1) = gronum 7 End With

お願い

現在手詰まりです....
ぜひなにか教えていただけるとありがたいです。
VBA初心者でコードが最適化されてなかったり読みにくかったりするのは申し訳ありません。
よろしくお願いします。

kokonoe_ks👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattuwan

2020/04/30 15:00

どの行でエラーなのかも書いて下さい。 一見、Findメソッドで見つからなかった場合、 Nothingに対してRowプロパティを見ようとすることになるので、 エラーになりそうですが、、、、 >lastcolumn = Worksheets(5).Cells(i, Columns.Count).End(xlToLeft).Column lastcolumn = .Cells(i, .Columns.Count).End(xlToLeft).Column がいいかな。。。
syo110

2020/04/30 23:32

わざわざ回答ありがとうございます。 エラーが出る文を追記させていただきました。 また教えてくださったコードを実行しましたが同じエラーがでてしまいました...
guest

回答1

0

ベストアンサー

えっと、
Findメソッドは、値の検索と言っても、
「表示されている文字列」の検索をします。
なので、値があるはずでも、セルの書式設定等で表示を変えていると、
ヒットしません。

テストコード、
新規ブックでお試しください。

ExcelVBA

1Sub Macro1() 2' 3' Macro1 Macro 4' 5 6' 7 Range("A4").Select 8 ActiveCell.FormulaR1C1 = "aa" 9 Range("B4").Select 10 ActiveCell.FormulaR1C1 = "cc" 11 Range("A5").Select 12 ActiveCell.FormulaR1C1 = "1" 13 Range("A5").Select 14 Selection.AutoFill Destination:=Range("A5:A21"), Type:=xlFillSeries 15 Range("A5:A21").Select 16 Range("D1").Select 17 ActiveCell.FormulaR1C1 = "5" 18 Range("A5:A21").Select 19 Selection.NumberFormatLocal = "(#)" 20 Selection.Find(What:="5", After:=ActiveCell, LookIn:=xlValues, LookAt:= _ 21 xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ 22 True, SearchFormat:=False).Activate 23End Sub

特に日付だと、中身はシリアル値、表示は
元号であったり西暦であったりさまざまなので、
検索出来ないトラブルが多いです。

あと、検索のさまざまなオプションを、
マクロを実行する前に手動で変更した場合も、
その設定を引きずってしまうので、
設定を省略すると期待した結果がでないことがあります。
この辺のトラブルが多いので注意が必要です。

ExcelVBA

1Sub test2() 2 Const sKeyNum As String = "5" 3 Const sGroup As String = "A" 4 Dim c As Range 5 6 With Worksheets(5).UsedRange 7 Set c = .Columns(1).Find(What:="5", _ 8 After:=.Item(.Rows.Count, "A"), _ 9 LookIn:=xlValues, _ 10 LookAt:=xlWhole, _ 11 SearchOrder:=xlByColumns, _ 12 SearchDirection:=xlNext, _ 13 MatchCase:=True, _ 14 SearchFormat:=False) 15 If Not c Is Nothing Then 16 .Item(c.Row, .Columns.Count + 1).End(xlToLeft).Offset(, 1).Value = sGroup 17 Else 18 MsgBox "見つかりませんでした。" 19 End If 20 End With 21End Sub

このような形で構えておけば、エラーが出ることはなくなるかと思います。

投稿2020/04/30 23:06

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syo110

2020/05/01 00:01

本当に助かりました。findの引数をしっかり指定し型変換を行ったら正常に動きました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問