• ベストアンサー

エクセルでプロシージャが終了しません。

ユーザーフォームのボタンをクリックしたら、特定のセルに現在の時刻を入力するマクロを作っています。 入力するところまではうまくいったのですが、プロシージャが終了しないので保存することができません。 どこが違うのかわからないので、わかる方よろしくお願いいたします。 Private Sub cmd1_Click() Dim hiduke As Date Dim hiduke2 As Integer hiduke = Now() hiduke2 = CInt(Day(hiduke)) If chk1.Value = True Then Cells(4, 1).Select Do Until ActiveCell.Value = hiduke2 ActiveCell.Offset(1, 0).Select Loop ActiveCell.Offset(0, 2).Value = hiduke Else Cells(4, 1).Select Do Until ActiveCell.Value = hiduke2 ActiveCell.Offset(1, 0).Select Loop ActiveCell.Offset(0, 8).Value = hiduke End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >Do Until ActiveCell.Value = hiduke2 hiduke2 はIntegerですから、ActiveCell.Value といっしょになるだけではなく、もう1つ、IsEmpty(ActiveCell.Value) が、True になる部分を、エラー処理としてループの中などに置くのが自然です。ただ、見つからない場合は、おそらく、1列目に書かれている日付がおかしいと思います。たぶん、シリアル値ではありませんか? Text プロパティで比較という方法もあるのですが、私は、あまり、そういう比較方法は、信頼性が低いと思います。 Excel VBAは、裏技的ですが、こういう処理の仕方があります。 例えば、日付の数字だけなら、 Dim Ret As Variant  If chk1.Value = True Then   Ret = Application.Match(hiduke2, Columns(1), 0)   If Not IsError(Ret) Then     Cells(Ret, 2).Value = hiduke   End If Else ・ ・ ・ じぁ、シリアル値の時はどうするか? Dim RngAdd As String  RngAdd = Range("A1", Range("A65536").End(xlUp)).Address If chk1.Value = True Then   Ret = Evaluate("Match(" & hiduke2 & ",Day(" & RngAdd & "), 0)")   If Not IsError(Ret) Then     Cells(Ret, 2).Value = hiduke   'Else   '  MsgBox "見つかりません。"   End If Else ・ ・ ・ 配列数式で処理します。なお、これは、私のオリジナル・テクニックではありません。

red-sato
質問者

お礼

早速の回答ありがとうございます。 1列目の値は手入力した数値になっています。 もしかしたらそれがいけないのでしょうか・・・。 教えてもらったシリアル値での処理も試してみたいと思います。 ありがとうございますm(__)m

その他の回答 (9)

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.10

>早速ためしてみたところ、『$A$12:9』と表示されました。 #9のKenKen_SPさんの回答に1票!。

red-sato
質問者

お礼

こんばんは☆ やはり#9さんの回答が大きなヒントなのですね! 私のやり方がマズイのか、■が邪魔してうまくいかないのですが、また1からじっくりやってみます。 ありがとうございます。

red-sato
質問者

補足

この場をお借りして皆様にお礼申し上げますm(__)m 初心者な私に親切にアドバイスしていただけて、大変勉強&参考になりました。 基礎を知らずになんとなくVBAを使っていたので、1からしっかり勉強してみようと思います。 皆様にポイントを差し上げたいのですが、なんとお二人様にしかポイントをつけることができないようです。 どれも選べないぐらい感謝していますが、ランダムでお二人様だけにポイントを付けさせていただきます。 (でも本当は皆様に1000ポイントぐらい差し上げたい気持ちです) また相談することもあるかと思いますが、その時はよろしくお願いいたします。 本当にありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.9

#8 の続きですが、、 >ここで止まってしまって、End Subまで実行してくれません。 End Sub の直前に Unload Me の一行を入れて、実行してみて下さい。セルへの転記 の後でフォームが自動で閉じるはずです。 この状態をEnd Sub まで実行した、、と勘違いされて いるとか?

red-sato
質問者

お礼

ありがとうございます☆ フォームは自動で閉じました! が、、、やっぱり・・・(笑) 本当に親切に教えていただいて、ありがとうございますm(__)m

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.8

> VBEの画面のリセットボタン(■←こういうマークのボタン)を > 押さないと、 フォームは表示されているのですよね? フォームの[X]ボタン(閉じる)をクリックしないと、VBE とか EXCEL の保存等の操作はできないと思いますが、、 この意味ではないですよね?

red-sato
質問者

お礼

こんばんは。 フォームは×で閉じてみたりもしたのですが、やはり■のリセットボタンを押さないとウンともスンとも言いませんでした(x_x;) 一度、表から作り直してみますね(^^;)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

red-satoさん、こんばんは。 >1列目の値は手入力した数値になっています。 >もしかしたらそれがいけないのでしょうか・・・。 私の目算は、どうやら外れたみたいだけれども、手入力だから、どうこということはありませんね。ワークシート上の日付などの値を、VBAで検索をする場合は、そのまま扱うと失敗する率が高いのですね。私は、今は、関数による配列数式やシリアル値の検索が一番うまくいきます。絶対ということではありません。後は、ローカルウィンドウで、それぞれの変数の値を確認することでしょうね。その上で、できれば、型は同じにさせたほうが確実です。

red-sato
質問者

お礼

こんばんは。 アドバイスありがとうございます。 基礎的なことをわかっていないのを痛感いたしました(^^;) 勉強も兼ねてイロイロ試してみたいと思います!

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.6

コードの最後、End Subの直前に Debug.Print ActiveCell.Address & ":" & ActiveCell.Value と付け加えて実行したら、イミディエイトウインドに 何と表示されますか?

red-sato
質問者

お礼

こんばんは。 何度もお手数お掛けしてすみません。 早速ためしてみたところ、『$A$12:9』と表示されました。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.5

>終了条件に一致する値は存在していて、ループが終了しています。 >そして『ActiveCell.Offset(0, 2).Value = hiduke』が実行されて特定のセルに現在の時刻が入力されます。 >しかし、ここで止まってしまって、End Subまで実行してくれません。 プロシージャが終了しないとのことなので、ループが 終わらないのかと思っていましたが、違うようですね。 では、エラーでストップしているということですか? ループが終了して、 ActiveCell.Offset(0, 2).Value = hiduke が実行されるのならとりあえず最後まで 走っているのではないでしょうか。 それなのにEnd Subまで走らないということは 提示されたコードは全体の一部分なのでしょうか? 止まったときにVBE画面のコードで黄色く強調される 部分があると思いますので、それを教えてください。 また、そのときに出るエラーメッセージもお願いします。

red-sato
質問者

お礼

ありがとうございます。 説明不足ですみません(x_x;) 質問で書いたコードは全てコピペしたもので、変更した部分などはない状態です。 また、黄色の反転やエラーメッセージがないのです。 VBEの画面のリセットボタン(■←こういうマークのボタン)を押さないと、他の操作が何もできない状態で、保存もできません。 何か私が初歩的な勘違いをしているような気がしてきました・・・(^^;)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

検索部で該当セルが見つからないとどんどん下にカーソルが移動して いきますが、それは置いておくとして、 > そして『ActiveCell.Offset(0, 2).Value = hiduke』が実行されて > 特定のセルに現在の時刻が入力されます。 それでは、このコードにエラーとなる要素がありません。コードの 掲載に省略された部分がありますか?

red-sato
質問者

お礼

早速の回答ありがとうございます。 該当セルは存在するはずで、該当セルの所でループは止まっている状態です。(見落としがあるのかもしれませんが・・・) コードは全文コピペしたもので、省略している部分はありません。 やっぱり私が何か勘違いしているのでしょうか(^^;)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 エラーメッセージの内容は教えて下さいね。 保護されているため、セルに書き込めないというのは?

red-sato
質問者

お礼

早速の回答ありがとうございます。 エラーメッセージは表示されません。 また黄色く反転する部分もないのですが、VBEの画面のリセットボタン(■←こういうマークのボタン)を押さないと、他の操作が何もできない状態です。 最初は保護していたのですが書き込めなかったので解除済みです(^^;) 説明下手ですみません。よろしくお願いします。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

Cells(4, 1).Select からループが始まっていますから、 A4セル以下にループの終了条件に一致する値 (hiduke2)が無いのではないですか? でもほおって置いても最終行までループすれば エラーでストップしますね。

red-sato
質問者

お礼

回答ありがとうございます。 終了条件に一致する値は存在していて、ループが終了しています。そして『ActiveCell.Offset(0, 2).Value = hiduke』が実行されて特定のセルに現在の時刻が入力されます。 しかし、ここで止まってしまって、End Subまで実行してくれません。 特に何もない部分なのになぜでしょう・・・(^-^;?

関連するQ&A

  • loop終了後のセルの一個右から同様のloopを行う方法

    ・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。 ・データはA列にランダムに数字が入っているものとします。 ・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。 ・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。 --------------------------- Sub 比較() Dim i As Integer Dim j As Integer Cells(1, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" i = 1 Do While Cells(i, 2).Value <> "" If Cells(i, 2).Value = "↓" Then Cells(1 + i, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" End If i = i + 1 Loop Cells(i - 1, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" j = 1 Do While Cells(i - 2 + j, 3).Value <> "" If Cells(i - 2 + j, 3).Value = "↓" Then Cells(i - 1 + j, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" End If j = j + 1 Loop End Sub

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • VBA Do Until内で値の貼り付けができない

    Excel2003を使用しております。 コピー&値のペースト作業をやってくれるマクロを作成しております。 具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、 D27がすでに値があれば、D28に書くことを、D37までループするようにしております。 しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。 Sub Ns公() Dim work As Range Set work = Selection If Selection.Value = "公" Then ActiveCell.Offset(0, -3).Select Selection.Copy Do Until Range("D37").Select Range("D27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop If Range("D36").Value <> "" Then Do Until Range("I37").Select Range("I27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop work.Select End If work.Select End If work.Select ActiveCell.Offset(1).Select End Sub 原因や対策をご教授いただけるとうれしいです。よろしくお願いします。

  • Excel VBA のDo Until Loopについて

    こんばんは Excel VBAの初心者です。 Do Until Loopを使って B列の値が変わるところ(下記の表だと、空白からコスモスに変わる、4行目。コスモスからチューリップに変わる6行目。チューリップから菊に変わる8行目。)に行を挿入させたいと思い、下記のマクロを組んだのですが、Do Until Loopが理解できませんでした。 どうしたら良いのか教えて頂けないでしょうか。 宜しくお願い致します。 Excelのシート B1  項目 B2  空白 B3  空白 B4  コスモス B5  コスモス B6  チューリップ B7  チューリップ B8  菊 Sub 行の挿入() Dim y As String Cells(2, 2).Select y = Cells(2, 2).Value Do Until Cells(2, 2).Value <> y ActiveCell.Offset(1).Select Selection.EntireRow.Select Selection.Insert shift:=xlDown Loop End Sub

  • エクセルで行を非表示にするとアクティブなセルが・・・

    エクセルで行を非表示にするとアクティブなセル?行?がどこかわからなくなり、マクロでアクティブなセルを移動するときにエラーが出ます。 Sub example() ActiveSheet.Range("D3").Select Do Until ActiveCell = 23 If ActiveCell <> "" Then ActiveCell.Offset(1, 0).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -3).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -6).Select Else: ActiveCell.EntireRow.Select Selection.EntireRow.Hidden = True ActiveCell.Offset(0, -6).Select End If Loop End Sub 一番下のActiveCell.Offset(0, -6).Select にエラーが出るのですが、どうすればセルを移動できるでしょうか?

  • Excel VBAフォーム 登録ボタンの作成方法

    いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub

  • Do loopのマクロ

    以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

  • マクロよ動け

    VBA 難民です。 Excel で、左のセルが空白の場合、印刷文字を見えなくするつもりのマクロを作ってみましたが、知らん顔をされます。声の掛け方がまだよくわかってないのです。 こっちを向かせる方法を教えて下さい。よろしくお願いします。 Sub MacroWhiter() Dim a As Variant Dim b As Variant a = ActiveCell.Value b = ActiveCell.Offset(0, -1).Value '一つ左のセルの値 Range("B1").Activate 'ここから始める Do Until IsEmpty(ActiveCell.Value) '空きセルまで続ける If b = 0 Then 'ゼロの場合 ActiveCell.Font.Color = 2 '文字を白色にする ActiveCell.Offset(1, 0).Activate '下の行に移る End If Exit Do Loop '繰り返す a = ActiveCell.Value

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

専門家に質問してみよう