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

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

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

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

Q&A

解決済

2回答

585閲覧

F列を確認し、F列で指定の文字列があったら、E列の値を変更したい

amatsuno

総合スコア54

VBA

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

0グッド

0クリップ

投稿2019/03/04 02:41

F列を参照し、F列に指定の文字列があったらE列にF列の値を入力したいと思っています

現在、以下のようなカラム構成になっています

AAA1,BBB1,CCC1,DDD1,0:01:01,10:20:30
AAA2,BBB2,CCC2,DDD2,0:02:02,10:20:31
AAA3,BBB3,CCC3,DDD3,0:03:03,10:20:32
AAA4,BBB4,CCC4,DDD4,0:04:04,10:20:33
AAA5,BBB5,CCC5,DDD5,0:05:05,10:20:34
AAA6,BBB6,CCC6,DDD6,0:06:06,23:59:58
AAA7,BBB7,CCC7,DDD7,0:07:07,10:20:30
AAA8,BBB8,CCC8,DDD8,0:08:08,23:59:58
AAA9,BBB9,CCC9,DDD9,0:09:09,10:20:30

このとき、F列が「23:59:58」の行に関しては、E列を「23:59:58」にしたいと思っています
※下記のように、AAA6とAAA8のE列を23:59:58にしたい

AAA1,BBB1,CCC1,DDD1,0:01:01,10:20:30
AAA2,BBB2,CCC2,DDD2,0:02:02,10:20:31
AAA3,BBB3,CCC3,DDD3,0:03:03,10:20:32
AAA4,BBB4,CCC4,DDD4,0:04:04,10:20:33
AAA5,BBB5,CCC5,DDD5,0:05:05,10:20:34
AAA6,BBB6,CCC6,DDD6,23:59:58,23:59:58
AAA7,BBB7,CCC7,DDD7,0:07:07,10:20:30
AAA8,BBB8,CCC8,DDD8,23:59:58,23:59:58
AAA9,BBB9,CCC9,DDD9,0:09:09,10:20:30

下記のコードで書いたのですが、
AAA6のほうだけが変換されてしまいます。
どのように修正すればいいのでしょうか?

Dim C As Long
Dim c2 As Range
'検索語
Const MYTXT As String = "23:59:58"

For C = 1 To Cells(Rows.Count, "F").End(xlUp).Row
Set c2 = ActiveSheet.Columns("F:F").Find(What:=MYTXT, _
LookIn:=xlValues, _
LookAt:=xlPart, _
MatchCase:=False)
If Not c2 Is Nothing Then
c2.Offset(0, -1).Value = "23:59:58"
End If
Next C

※上記のF列は、以下のコードで出力しています
(別セルでつき合わせて、存在しないものを1 - 2 / 24 / 3600で指定)
With rngResult.CurrentRegion.Columns(2)
.NumberFormatLocal = "[hh]:mm:ss"
.Formula = sMyFormula
On Error Resume Next
.SpecialCells(xlCellTypeFormulas, xlErrors).Value = 1 - 2 / 24 / 3600
On Error GoTo 0
.Copy
.PasteSpecial Paste:=xlPasteValues
.TextToColumns
End With

お分かりになられる方、よろしくお願いいたします

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

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

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

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

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

torisan

2019/03/04 04:04

VBAはF8でステップ実行ができるので 処理がどのように動いているか、追っていった方がいいと思われます。 また、FindNextという関数があるそうです。
guest

回答2

0

.SpecialCells(xlCellTypeFormulas, xlErrors).Value = 1 - 2 / 24 / 3600

.SpecialCells(xlCellTypeFormulas, xlErrors).resize(,2).offset(,-1).Value = 1 - 2 / 24 / 3600

でいかがでしょう?

結果が得られて、「できた!」で終わらず、
1行1行のコードの意味を理解する努力をしないと、
いつまでたっても一人でマクロが書けないと思いますよ。

SpecialCellsとは、手動では「ジャンプ」という機能にあたります。
そしてxlCellTypeFormulasは数式、
xlErrorsとは、エラー値の意味になります。
そこで見つけたセル範囲を2列分に拡張し、
1列分左にずらしたセル範囲の値を、
時間を意味する「23:59:58」という値をセルに入れたいということですよね?

※飛び飛びのセル範囲をRisizeとかOffsetとかで変えたときに、
どうなるか実際に試してないですが、だめだったらまた、教えてください。

投稿2019/03/04 04:34

mattuwan

総合スコア2136

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

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

amatsuno

2019/03/04 04:44

ご指摘、ありがとうございます。 本件は、F列に該当するものが、「実使用時間」でE列に値するものが「電源OFF時刻」となります。 F列で23:59:58となっているものは、実使用されず、かつ電源OFFがされなかった機器となります (別処理で、実使用時間が取れない機器はF列に無理やり23:59:58を入れています) その条件で、E列に投入する値を上書き指定しています (F列は時間で、E列は時刻となります)
mattuwan

2019/03/04 05:19

本業の合間に息抜きに回答しています。 そちらの実務について理解する気はありません。 Vlookup関数で参照して、エラー値になるデータについては、 数式を入れた左隣りのセルも上書きするという事ではないですか? そういう事なら、いちいち検索機能で検索するより、 ジャンプ機能で一括で検索できるのでは?と、提案しているまでです。 そういう考え方で記述してエクセル君がちゃんと希望通り動いてくれるかを、ご自分で確認して、その結果を教えて欲しいです。 まぁ、結果報告はそちらの都合でご自由に。
guest

0

ベストアンサー

Findの使い方の問題ですね。
複数ヒットする可能性があるなら、後続の検索をFindNextで続ける必要があります。

VBA

1Dim c2 As Range 2'検索語 3Const MYTXT As String = "23:59:58" 4Dim firstRow As Long 5 6Set c2 = ActiveSheet.Columns("F:F").Find(What:=MYTXT, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False) 7If Not c2 Is Nothing Then 8 firstRow = c2.Row 9 Do 10 c2.Offset(0, -1).Value = c2.Value 11 Set c2 = ActiveSheet.Columns("F:F").FindNext(c2) 12 Loop Until firstRow = c2.Row 13End If

投稿2019/03/04 04:12

編集2019/03/04 04:25
ttyp03

総合スコア16996

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

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

amatsuno

2019/03/04 04:23

ありがとうございます。 下記までは何とか考えたのですが、 以降の処理ができなくなってしまっていたので、本当に助かりました ' Dim c As Range ' Dim FirstAdd As String ' Const MYTXT As String = "23:59:58" ' Set c = ActiveSheet.Columns("F:F").Find(What:=MYTXT, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False) ' If Not c Is Nothing Then ' FirstAdd = c.Address ' Do ' c.Offset(, -1).Value = "23:59:59" ' Set c = ActiveSheet.Columns("F:F").FindNext(c) ' If c.Address = FirstAdd Then Exit Sub ' Loop Until c Is Nothing ' End If
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問