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

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

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

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

Q&A

解決済

2回答

1182閲覧

時間処理について(比較し含まれている方を消したい)

teraken

総合スコア13

VBA

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

0グッド

0クリップ

投稿2017/07/07 14:14

編集2017/07/07 14:23

イメージ説明前提・実現したいこと
1列の同じ項目内で時間を比較し、時間が含まれているほうの行を消したい
画像の赤枠が残るようにしたい

###発生している問題・エラーメッセージ
1行目の目次を比較してしまいエラーになる
また、無駄に1列を比較してしまっている

エラーメッセージ

###該当のソースコード
Sub test()
' Macro10 Macro
'' Macro7 Macro
'
Dim k, i, i2 As Long
Dim TMaxRow As Variant
Dim start, start2, ennd, ennd2 As Date

k = Range("A1").End(xlDown).Row
Stop

For i = k To 2 Step -1

For i2 = 1 To k - 2
start = Cells(i, "B") + Cells(i, "C")
ennd = Cells(i, "D") + Cells(i, "E")
start2 = Cells(i - i2, "B") + Cells(i - i2, "C")
ennd2 = Cells(i - i2, "D") + Cells(i - i2, "E")
Stop
If Cells(i, "A") = Cells(i - i2, "A") And start <= start2 And ennd >= ennd2 Then

Cells(i - i2, "B") = Cells(i, "B")
Cells(i - i2, "C") = Cells(i, "C")
Cells(i - i2, "D") = Cells(i, "D")
Cells(i - i2, "E") = Cells(i, "E")

Rows(i).Delete
GoTo LABEL1
End If

If Cells(i, "A") = Cells(i - i2, "A") And start >= start2 And ennd <= ennd2 Then

Rows(i).Delete
End If
LABEL1:
Stop
Next i2
Next i
End Sub
###試したこと
課題に対してアプローチしたことを記載してください
配列をつかおうとしたが、一行ずつ格納する方法がわからず、手じまい

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

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

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

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

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

hatena19

2017/07/08 02:50

コード部分は、コードタグで囲んでください。コードを選択して、エディタのツールバーのコードボタン(</>)をクリックすると囲まれます。
guest

回答2

0

ベストアンサー

質問者さんの現状のコードをなるべく活かして修正してみました。

  • 変数宣言では、1行に記述する場合でも、一つずつ型を指定する、しないとVariant型になります。
  • Gotoは使わない
  • Cellsは列を英字で指定することは可能ですが、速度を重視するなら数字の方がベター、件数が多くなくて読みやすさを重視するなら英字もあり。
Sub test() Dim k As Long, i As Long, i2 As Long Dim start As Date, start2 As Date, ennd As Date, ennd2 As Date Dim name1 As String, name2 As String k = Range("A1").End(xlDown).Row '最終行から上に走査する For i = k To 3 Step -1 '比較元 name1 = Cells(i, "A") start = Cells(i, "B") + Cells(i, "C") ennd = Cells(i, "D") + Cells(i, "E") 'iの一つ上から上に向かって走査する For i2 = i - 1 To 2 Step -1 '比較先 name2 = Cells(i2, "A") start2 = Cells(i2, "B") + Cells(i2, "C") ennd2 = Cells(i2, "D") + Cells(i2, "E") If name1 = name2 Then '名前が一致 If start <= start2 And ennd >= ennd2 Then '比較先が比較元に含まれる '比較元のデータを比較先にコピー Cells(i2, "B") = Cells(i, "B") Cells(i2, "C") = Cells(i, "C") Cells(i2, "D") = Cells(i, "D") Cells(i2, "E") = Cells(i, "E") Rows(i).Delete '比較元行を削除 ElseIf start >= start2 And ennd <= ennd2 Then '比較元が比較先に含まれる Rows(i).Delete '比較元行を削除 End If End If Next i2 Next i End Sub

「比較先が比較元に含まれる」場合、コピーせずに、比較先を削除して、上にずれた分iを補正してもOKです。

If start <= start2 And ennd >= ennd2 Then '比較先が比較元に含まれる Rows(i2).Delete '比較先行を削除 i = i - 1 '削除でずれた分の補正

投稿2017/07/08 03:05

編集2017/07/08 04:03
hatena19

総合スコア33715

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

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

0

動かしてはいませんが、こんな感じでいけませんか?

・次からはインデントをつけるようにしてくださいね。
・なるべくGotoを使うのは避けましょう
・cellでは、cell(1,1)のように、数字でアドレスを指定します。
→rangeでは、range(A1)のように、英字+数字の名前を使う時にはRangeを使ってください。

VBA

1Sub test() 2 Dim k, i, i2 As Long 3 Dim TMaxRow As Variant 4 Dim start, start2, ennd, ennd2 As Date 5 Dim name, name2 as String '分かりやすいように名前変数を足しました 6 7 k = Range("A1").End(xlDown).Row 8 9 '下側から順番に走査する 10 For i = k To 2 Step -1 11 '「比較元」のデータ 12 name = Cells(i, 1) 13 start = Cells(i, 2) + Cells(i, 3) 14 ennd = Cells(i, 4) + Cells(i, 5) 15 16 'iの1つ上を起点に、下から順番に走査する 17 '(i2を2行目まで走査してしまうと、i=i2の時に初めの行まで消されてしまうので注意です。) 18 For i2 = k - 1 To 3 Step -1 19 '「比較先」のデータ 20 name2 = Cells(i2, 1) 21 start2 = Cells(i2, 2) + Cells(i2, 3) 22 ennd2 = Cells(i2, 4) + Cells(i2, 5) 23 24 '名前が同じかつ、時間が同じとき 25 If name = name2 And start = start2 And ennd = ennd2 Then 26 27 '重複している行のうち、上側のものを削除 28 Rows(i2).Delete 29 30 'ズレた行数を補正 31 i = i - 1 32 i2 = i2 - 1 33 34 Next i2 35 Next i 36End Sub 37

投稿2017/07/07 22:04

編集2017/07/07 22:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問