今月VBAを勉強し始めた初心者です。
Webにて入力されたcsvファイルを編集する際に
最新投稿を残して表に出力する目的で
下記のマクロを作成して実行してみたところ
変数i、jが0になるまでループが繰り返されてエラーになってしまいます。
ループ範囲指定のどこに問題があるのでしょうか?
こちら側の環境が
OS:Windows7 64bit Ultimate
Office2007
です。
ご教授宜しくお願い致します。
Sub namaesakujo()
Dim i As Integer
Dim j As Integer
Dim mct As Integer
Dim Name1 As String
Dim Name2 As String
Dim Time1 As Long
Dim Time2 As Long
Worksheets("result").Activate
mct = Worksheets("result").UsedRange.Rows.Count '最大行数を指定
Name1 = Cells(i, 2).Value '名前1
Name2 = Cells(j, 2).Value '名前2
Time1 = Cells(i, 1).Value '時間1
Time2 = Cells(j, 1).Value '時間2
'変数iを最終行数~2行目まで指定
i = mct
Do While i > 2
'変数jを最終行数~2行目まで指定
j = mct
Do While j > 2
'2列目iと2列目jが等しい(名前が同じ)場合、日時が小さい方を削除する
If Name1 = Name2 And Time1 > Time2 Then
Cells(j, 1).EntireRow.Delete
End If
j = j - 1
Loop
i = i - 1
Loop
MsgBox "更新完了"
End Sub
No.4ベストアンサー
- 回答日時:
コードの不適格個所は他の回答で勉強して。
ーー
質問には、データ例を10行内外で書け。
そしてやりたいことをデータ例に沿って、文章で書け。
回答者にコードを読み解かせるようなことは少なくせよ。
質問者の意図とコードがちぐはぐであることもあり(むしろそれが多い)判りにくいコードを読まされて、よくわからないことがある。
ーー
ほかに
プログラムを考えるときには、処理の大枠(わたしはロジックといっている)の適当なものを考えて、捜して想を練る必要がある。
これは1週間や数個の課題では習得できないものだ。
初心者はこの段階で変なやり方で取り組み勝ち。
ーー
本件は質問の意味がよくわからないが、要らない行を削除しないで、元データは元のままで、別シートに(別列に)必要なデータを整えるという式で考えると良い。
また同じものを省くときデータをキーでソートすると、同じものは付近行に塊となってくれるので、前後を考えておれば済むことが多く、処理が簡単になることが多い。
1週間ぐらいの学習で、VBAの自分がしたいことが出来るのは立派なものだが、
むしろ重点は、他人の組んだWEBや解説書の例を多数追試して、取り入れることが大切な時期と思う。
VBAやプログラムをを甘く見ないこと。
この回答への補足
皆様方のアドバイスの結果、二重ループを下記のようにすることで求めていた処理が得られました。ありがとうございます。
ただ、下記は無駄な処理が非常に多いので、もう少し手を加えて無駄を省いていきたいと思います。
ご回答者の皆様方、親身になっていただき本当にありがとうございました。
以降も学習を続けて様々なマクロを作成できるように精進してまいります。
mct = Worksheets("result").UsedRange.Rows.Count '最大行数を指定
Label1:
'変数iを最終行数~2まで指定
For i = 2 To mct
Name1 = Cells(i, 2).Value '名前1
Time1 = Cells(i, 1).Value '時間1
'変数jを最終行数~2まで指定
For j = 2 To mct
'2列目iと2列目jが等しい(名前が同じ)場合、日時が小さい方を削除する
Name2 = Cells(j, 2).Value '名前2
Time2 = Cells(j, 1).Value '時間2
If Name1 = Name2 And Time1 < Time2 Then
Cells(i, 1).EntireRow.Delete
GoTo Label1
End If
Next
Next
理解しがたい質問をしてしまい大変申し訳ございませんでした。
オンラインゲームでのイベント運営にて参加者の表を作成する為、今回のコードを書くに至りました。
下記が例になります。
date 名前 lv 職
1 A 40 片手
2 B 40 片手
3 B 40 大剣
4 C 40 片手
5 D 40 大剣
6 E 40 片手
7 F 40 大剣
8 D 40 大剣
上記のように投稿順にデータが格納されて、名前が同じ場合に新しいもののみを残して(上記で言うと3行目と5行目のBとDを削除します)新しく表を作り直して参加者をソートする目的です。
>要らない行を削除しないで、元データは元のままで、別シートに(別列に)必要なデータを整えるという式で考えると良い。
こちらは別シート(別列)にコピーアンドペーストを行うようにするのでしょうか。
>他人の組んだWEBや解説書の例を多数追試して、取り入れることが大切な時期と思う。
>VBAやプログラムをを甘く見ないこと。
ご助言ありがとうございます。
一つだけではなく、複数の入門書にて学習し直していきます。
No.3
- 回答日時:
ループの考え方が全然だめですね、Do~Loop間でName、Timeが変動しません。
考え方を少し変えてみては如何でしょうか。
例えば、(1)データを時間列で降順にソート、(2)名前列で重複削除では駄目
でしょうか。
(上記の操作をマクロ記録で一度コードを参照してみては如何でしょうか)
ご回答ありがとうございます。
Name及びTimeのみをIf文で処理を行ったところ削除が行われなかったり、必要のない行の削除が行われていました。
この処理の前に別の列にてソート処理を行っておりまして、そちらを流用してソートをかけ直してみようと思います。
マクロ記録という機能はまだ試したことがなかった為、一度使用して機能を把握致します。
No.2
- 回答日時:
[F8]でステップ実行してみました?
変数について変な思い違いをされている様に思います。
Name1 = Cells(i, 2).Value
と、すると変数iが1,2,3と変化するたびにName1の値がCells(1, 2).Value、Cells(2, 2).Value、Cells(3, 2).Value
と変わっていく訳では有りません。代入した時点のiの値、つまりi=0で代入が行われます。
従って、
Name1 = Cells(0, 2).Value
が実行され、エラーになっています。
現在のコードではループが回って0まで行ってエラーになっているのではなく、ループに入る前にエラーになっています。
今のコードをそのまま活かすなら、
Name1 = Cells(i, 2).Value '名前1
Time1 = Cells(i, 1).Value '時間1
を Do While i > 2 の下に移動し、
Name2 = Cells(j, 2).Value '名前2
Time2 = Cells(j, 1).Value '時間2
を Do While j > 2 の下に移動して見てください。
ご回答ありがとうございます。
Cor_moriyan様へのお礼でも記入致しましたが、iとjに初期値を与えることでその部分のエラーは解決いたしました。
その他のループ処理の考え違いを勉強しなおして再び作成していきます。
No.1
- 回答日時:
そもそも Do While に入る前の Name1 = Cells(i,2).Value でエラーになりませんか?この時点での i の値はゼロですし。
。。本当に
> 変数i、jが0になるまでループが繰り返されてエラー
となってます?もう一度、エラーの出た箇所とエラー内容を良く確認してみて下さい。
それと。
今回の様に、変数の値が一定の増減があって繰り返すような場合、For~Next の方がわかりやすいデス。
For i=mct to 2 Step -1
For j=mct to 2 Step -1
If Name1 = Name2 And Time1 > Time2 Then
Cells(j, 1).EntireRow.Delete
End If
Next
Next
ご回答ありがとうございます。
ループ処理に入る前にエラーが出ていたのですね・・・
勘違いをしてしまい申し訳ございません。
i と jに初期値を与えるとその部分でのエラーは発生しなくなりました。
他の方もおっしゃっているように他にも色々と問題があるようですので再勉強をしてもう一度作成し直してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
【VBA】ワークブックを開く時に...
-
フランスの生年月日(jj/mm/aaaa)
-
教えてください。FTPアップロー...
-
VBAでfunctionを利用しようとし...
-
WindowsのプロダクトIDを取得す...
-
筆王画面が終了できない
-
ActiveCell.FormulaR1C1の変数
-
VBAのリストボックスで、横スク...
-
VBでコンパイル エラー 変数...
-
数式は残し値をクリアするマク...
-
実行時エラー 438 の解決策をお...
-
Excel実行時エラー[80004005]に...
-
VBAの構文エラー
-
エクセルVBAの二重ループについて
-
「実行時エラー '3167' レコー...
-
【Access】Excelインポート時に...
-
文字列内で括弧を使うには
-
ASP.NETのサーバー移行に伴うエ...
-
Filter関数を用いた結果、何も...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
VBA データ(特定値)のある最...
-
お助けください!VBAのファイル...
-
文字列内で括弧を使うには
-
On ErrorでエラーNoが0
-
「実行時エラー '3167' レコー...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
Excel vbaについての質問
-
ACCESSで値を代入できないとは?
-
実行時エラー 438 の解決策をお...
-
【VBAエラー】Nextに対するFor...
-
Filter関数を用いた結果、何も...
-
ApplicationとWorksheetFunctio...
-
エクセルVBAで埋め込みグラフ(C...
-
VBでSQL文のUPDATE構文を使った...
おすすめ情報