[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コードが動かなくなりました』(うーん)
はじめまして
以前競馬の成績をシートにコピペして一覧形式にするマクロをつくりました
でも最近動かしたら
←のところで型がいっちしませんと出るようになりました
なぜでしょうか
コード
Option Explicit
Sub 成績1()
'
' Macro4 Macro
Dim max_row As Long
Dim min_row As Long
'開始行と最終行の行番号取得
min_row = Worksheets("マクロ前").UsedRange.Row
max_row = Worksheets("マクロ前").UsedRange.Rows.Count - min_row - 1
Application.ScreenUpdating = False Dim cnt As Long Dim r As Variant Dim レース番号 As Variant Dim レース名 As Variant Dim 距離1 As Variant Dim 距離2 As Variant Dim 距離3 As Variant Dim 斤量 As Variant Dim 斤量2 As Variant Dim 斤量3 As Variant Dim 騎手1 As Variant Dim 騎手2 As Variant Dim 騎手3 As Variant Dim 馬体重 As Variant Dim 一着 As Variant Dim 二着 As Variant Dim 三着 As Variant Dim 四着 As Variant Dim 五着 As Variant Dim 単勝 As Variant Dim 複勝 As Variant Dim 複勝2着 As Variant Dim 複勝3着 As Variant Dim 性齢 As Variant Dim 日付1 As Variant Dim 日付2 As Variant Dim 場1 As Variant Dim クラス As Variant Dim タイム As Variant Dim shp As Shape Dim MyRNG As Range Dim MyRNG2 As Range
With ActiveSheet For Each MyRNG In .Range("A1", .Cells(.Rows.Count, "A").End(xlUp)) If MyRNG.Value Like "*R*" Then MyRNG.Copy MyRNG.Offset(, 1)
End If Next MyRNG End With
cnt = 1
Application.DisplayAlerts = False Sheets("マクロ前").Select Cells.Select Range("B1").Activate Selection.UnMerge ' Columns("b:b").Select Selection.Replace What:="*R", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False
Columns("B:L").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Columns("A:A").Select Selection.Replace What:="(混)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="[指]", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(特指)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(国際)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(指)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="サラ系", Replacement:="サラ系 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(牝)", Replacement:="牝 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="( 別定 )", Replacement:=" 別定 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="( 馬齢 )", Replacement:=" 馬齢 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="( 定量 )", Replacement:=" 定量", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(ハンデ)", Replacement:=" ハンデ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Cells.Replace What:="( 別定 )", Replacement:=" 別定 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="芝右", Replacement:="芝右 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="芝左", Replacement:="芝左 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="ダート右", Replacement:="ダート右 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="ダート左", Replacement:="ダート左 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="年", Replacement:="年 ", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("A10").Select Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _ :=Array(1, 1), TrailingMinusNumbers:=True Columns("B:L").Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlToLeft Columns("F:G").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Columns("C:C").Select Range("C203").Activate '一時的無効化 'Selection.Replace What:="*(", Replacement:="(", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False ' Selection.Replace What:="(", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False ' Selection.Replace What:=")", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False
With ActiveSheet For Each MyRNG2 In .Range("c1", .Cells(.Rows.Count, "c").End(xlUp)) If MyRNG2.Value Like "牝" Then MyRNG2.Copy MyRNG2.Offset(-1, 3)
End If Next MyRNG2 End With
Columns("E:E").Select
Range("E42").Activate Selection.TextToColumns Destination:=Range("E1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _ :=Array(1, 1), TrailingMinusNumbers:=True
Columns("F:G").Select
Range("F54").Activate Selection.SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlToLeft Columns("E:E").Select Range("E49").Activate Selection.SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlToLeft Columns("C:C").Select Range("C155").Activate Selection.Replace What:="4歳上", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False
For r = min_row To max_row
If Worksheets("マクロ前").Cells(r, 1).Value Like "202?年" Then ← 'データ取得1 日付1 = Worksheets("マクロ前").Cells(r, 2).Value 場1 = Worksheets("マクロ前").Cells(r, 3).Value
End If
If Worksheets("マクロ前").Cells(r, 1).Value Like "*R" Then 'データ取得
レース番号 = Worksheets("マクロ前").Cells(r, 1).Value
レース名 = Worksheets("マクロ前").Cells(r + 2, 1).Value
クラス = Worksheets("マクロ前").Cells(r + 2, 2).Value
距離1 = Worksheets("マクロ前").Cells(r + 2, 3).Value
距離2 = Worksheets("マクロ前").Cells(r, 5).Value
一着 = Worksheets("マクロ前").Cells(r + 5, 4).Value
二着 = Worksheets("マクロ前").Cells(r + 6, 4).Value
三着 = Worksheets("マクロ前").Cells(r + 7, 4).Value
騎手1 = Worksheets("マクロ前").Cells(r + 5, 7).Value
騎手2 = Worksheets("マクロ前").Cells(r + 6, 7).Value
騎手3 = Worksheets("マクロ前").Cells(r + 7, 7).Value
斤量 = Worksheets("マクロ前").Cells(r + 5, 6).Value
タイム = Worksheets("マクロ前").Cells(r + 5, 9).Value
'着順終了
単勝 = Worksheets("マクロ前").Cells(r + 9, 3).Value
複勝 = Worksheets("マクロ前").Cells(r + 10, 3).Value
複勝2着 = Worksheets("マクロ前").Cells(r + 11, 3).Value
複勝3着 = Worksheets("マクロ前").Cells(r + 12, 3).Value
性齢 = Worksheets("マクロ前").Cells(r + 5, 5).Value
'データ書き出し
Worksheets("書き出し").Cells(cnt, 1).Value = 日付1
Worksheets("書き出し").Cells(cnt, 2).Value = 場1
Worksheets("書き出し").Cells(cnt, 3).Value = レース番号
Worksheets("書き出し").Cells(cnt, 4).Value = レース名
Worksheets("書き出し").Cells(cnt, 5).Value = クラス
Worksheets("書き出し").Cells(cnt, 6).Value = 距離1
Worksheets("書き出し").Cells(cnt, 7).Value = 距離2
Worksheets("書き出し").Cells(cnt, 8).Value = 一着
Worksheets("書き出し").Cells(cnt, 9).Value = 二着
Worksheets("書き出し").Cells(cnt, 10).Value = 三着
'着順終了
Worksheets("書き出し").Cells(cnt, 11).Value = "払戻金"
Worksheets("書き出し").Cells(cnt, 12).Value = 単勝
Worksheets("書き出し").Cells(cnt, 13).Value = 複勝
Worksheets("書き出し").Cells(cnt, 14).Value = 複勝2着
Worksheets("書き出し").Cells(cnt, 15).Value = 複勝3着
Worksheets("書き出し").Cells(cnt, 16).Value = 性齢
Worksheets("書き出し").Cells(cnt, 17).Value = 騎手1
Worksheets("書き出し").Cells(cnt, 18).Value = 騎手2
Worksheets("書き出し").Cells(cnt, 19).Value = 騎手3
Worksheets("書き出し").Cells(cnt, 21).Value = 斤量
Worksheets("書き出し").Cells(cnt, 22).Value = タイム
cnt = cnt + 1
End If
Next r
Sheets("書き出し").Select Cells.Select Selection.Replace What:="円", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="r", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="サラ系", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Columns("C:C").Select Selection.NumberFormatLocal = "G/標準" Columns("D:D").Select Selection.Replace What:="(*)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Columns("C:C").Select Selection.Replace What:="r", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Columns("A:A").Select Selection.Replace What:="(*)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("A1:a100").Select Selection.Copy Sheets("成績2").Select Range("C1").Select Selection.End(xlDown).Offset(1, 0).Select ActiveSheet.Paste Sheets("書き出し").Select Range("c1:p100").Select Selection.Copy Sheets("成績2").Select Range("e1").Select Selection.End(xlDown).Offset(1, 0).Select ActiveSheet.Paste Columns("v:v").Select Selection.NumberFormatLocal = "m:ss.0" Range("b1").Select Columns("q:q").Select Selection.NumberFormatLocal = "G/標準" Sheets("書き出し").Select Cells.Select Selection.ClearContents Sheets("マクロ前").Select ActiveSheet.DrawingObjects.Select ActiveSheet.Shapes.SelectAll ActiveSheet.Shapes.SelectAll ActiveSheet.DrawingObjects.Select Selection.Delete Cells.Select Selection.ClearContents Range("a1").Select Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub サイト https://keiba.yahoo.co.jp/race/price/21050301/ です助けてください
< 使用 Excel:Excel2019、使用 OS:Windows10 >
これ、Range("A1:E20").row
とやっているのと何ら変わりがないと思いますが・・・。
ちゃんと意味が解っているんですかね?
(不明) 2021/06/29(火) 20:19
こんばんは! 今まで動いていた方が奇跡であっていつ動かなくなってもおかしくないコードだから仕方がないとしか言えません。 なので取り敢えず
min_row = Worksheets("マクロ前").UsedRange.Row max_row = Worksheets("マクロ前").UsedRange.Rows.Count - min_row - 1
のUsedRange とか Selection とかを全部やめてきちんと書く
それからコードを書くということは、デバッグするということで書くだけなら極端に言えば誰でも書けるわけです。
型の宣言も なんでもかんでも Variant はなくて ちゃんと指定する
そんなこんなでとても面倒の見れるようなコードじゃないのでもう一度全部書き直した方がいいです。
まぁ、その黄色くなっているところにカーソルを当てて変数の中身をみてみるとか、、、ぐらいで 動かないから何とかしてくださいと言われてもこっちが「何とかしてください」です。 (SoulMan) 2021/06/29(火) 21:06
(?) 2021/06/29(火) 21:33
あっ、そうなんですね。。。 検証ご苦労様です。ありがとうございます。 ということは、不確定要素が多すぎて再現性がないということでしょうか?
では、その マクロ前 というシートを新規に作成してみるとかでしょうか? (SoulMan) 2021/06/29(火) 21:38
(ひろくん) 2021/06/29(火) 22:13
ニックネームなぜ変更した。 >なんででしょうか 貴方のExcelがおかしいのでは? >マクロですかどういうマクロを書けばいいですか >(ひろくん) 2021/04/25(日) 22:43 と言っているので本当に自分で作成したのか疑う予知あり。
(?) 2021/06/29(火) 22:47
ただ、エラーの出てしまう場合もありますね。
それはコードを理解できていないからかと思います。
(あみな) 2021/06/30(水) 05:59
■1
VBAの世界では基本的にシートやセル(オブジェクトといいます)を明示すれば、いちいち選択したりアクティブにしたりする必要はありません。
さらに、「標準モジュール」でシートの指定を省略すると、アクティブシートを指定したものとして扱われます。
したがって、複数のシートを相手にする処理を考えるのであれば、きちんとオブジェクトを修飾(指定)するようにしたほうが良いでしょう。
■2
「もちろんコードは触ってません」とのことですが、おかしいのであれば、むしろちゃんと自己検証して修正すべきでしょう。
そして検証作業には、やはり【ステップ実行】が有用であるとおもいますのでトライしてみてはどうですか?
※どうも↓と同一の方のようですが再掲します。
[[20210625225354]] 『シートの並べ替えで』(ひろくん)
【ステップ実行】 https://www.239-programing.com/excel-vba/basic/basic023.html http://plus1excel.web.fc2.com/learning/l301/t405.html
また、以下も知っておいて損は無いと思います。
【イミディエイトウィンドウ】 https://www.239-programing.com/excel-vba/basic/basic024.html https://excel-ubara.com/excelvba1/EXCELVBA486.html
【ローカルウィンドウ】 https://excel-ubara.com/excelvba4/EXCEL266.html http://excelvba.pc-users.net/fol8/8_2.html
【ブレークポイント】 https://www.239-programing.com/excel-vba/basic/basic022.html https://www.tipsfound.com/vba/01010
■3
マクロの実行に寄与するものではありませんが、インデント(字下げ)をするのもデバッグ作業には有効だと思いますので、こだわりが無ければキチンとインデントを付けることをお勧めします。
(現状だと、どこからどこまでがループなのかぱっと見わかりませんよね?)
(もこな2) 2021/06/30(水) 08:05
($$) 2021/06/30(水) 18:24
>えっエラーがなかったですかなんででしょうか >(ひろくん) 2021/06/29(火) 22:13
まぁいずれにせよ、知っておいて損は無いと思いますので確認してみてください。
■5
対象オブジェクトを明確にすべきことは既に指摘していますが、他にも↓のように既定値はわざわざ指定しない(省略する)というのも、コードを見やすくする上では有用であるとおもいます。
Columns("A:A").Select Selection.Replace What:="(混)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="[指]", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(特指)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="(国際)", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False
↓
With ActiveSheet.Columns("A:A") .Replace What:="(混)", Replacement:="", LookAt:=xlPart .Replace What:="[指]", Replacement:="", LookAt:=xlPart .Replace What:="(特指)", Replacement:="", LookAt:=xlPart .Replace What:="(国際)", Replacement:="", LookAt:=xlPart
また、何度も置換処理をするのであれば、どこかに置換一覧表を作成しておいて、ループ処理にするという手もありますね。
■6
また、好みによるのでしょうが、↓のように1度しか出てこないものをいちいち変数に格納するのも効率が悪いようにおもいますので、コピペする処理にしてみたり、Valueプロパティを直接参照するようにしてもよいでしょう。
騎手1 = Worksheets("マクロ前").Cells(r + 5, 7).Value 騎手2 = Worksheets("マクロ前").Cells(r + 6, 7).Value 騎手3 = Worksheets("マクロ前").Cells(r + 7, 7).Value Worksheets("書き出し").Cells(cnt, 17).Value = 騎手1 Worksheets("書き出し").Cells(cnt, 18).Value = 騎手2 Worksheets("書き出し").Cells(cnt, 19).Value = 騎手3
■7
>←のところで型がいっちしませんと出るようになりました
とりあえず、その部分だけ抜き出してどの【行】でエラーが出るかチェックしてみたらどうですか?
Sub test() Dim r As Long
With Worksheets("マクロ前") For r = .UsedRange.Row To .UsedRange.Rows.Count - min_row - 1 If .Cells(r, 1).Value Like "202?年" Then MsgBox r & "行目" Next End With End Sub
(もこな2) 2021/06/30(水) 18:44
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.