• ベストアンサー

エクセルVBAでの繰り返し処理について

1行目には1ヶ月分の日付がはいっています。 2行目にはWEEKDAY関数で1行目の日付の曜日をいれています。 3行目に月曜日(WEEKDAY関数では2)なら公休日の"公"と表示したいのですがどのようにしたらよいでしょうか? Sub 公休日() If Range("A2").Value = 2 Then Range("A3").Value = "公" End If End Sub このような作業を繰り返すにはどうすればよいでしょうか? 補足として、エクセル2007を使用しています。 3行目には数字を入力するためIF関数を使うことができません。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! すでに回答は出ていますので、余計なお世話かもしれませんが・・・ VBAで処理する場合、気を付けなければならないコトがあります。 同じ表を月が変わっても使用する場合、月が変われば「2」の列が変わってきますよね? 関数の場合は自動で「2」だけの列を判断してくれますが、VBAでは実データとなっているために 「前月」に表示されている「公」はそのまま残ってしまいます。 すなわち月が変われば一旦「公」を消去する必要があります。 ループさせるときに、「2」以外であれば空白に!という条件を付けくわえてやります。 ループの方法はNo.1さんが回答されていますので、 3行目を一旦数式で表示させそれを実データにする方法です。 Sub Sample1() Dim lastCol As Long lastCol = Cells(1, Columns.Count).End(xlToLeft).Column With Range(Cells(3, "A"), Cells(3, lastCol)) .Formula = "=IF(OR(A2="""",A2<>2),"""",""公"")" .Value = .Value End With End Sub こんな感じでも大丈夫だと思います。m(_ _)m

arishia0307
質問者

お礼

ご丁寧にありがとうございました。 試してみましたらちゃんと月曜に公休がつきました。 本当に助かりました。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です。 たびたびごめんなさい。 投稿後気づきました。 前回のコード内の数式はもっと簡単な数式で大丈夫でしたね。 >.Formula = "=IF(OR(A2="""",A2<>2),"""",""公"")" の行を >.Formula = "=IF(A2=2,""公"","""")" に変更してください。 どうも失礼しました。m(_ _)m

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

ループを回したり、変数で位置を指定するのでしたら、RangeではなくCellsを使った方が解りやすいと思います。 やりたいのはこういう事では無いでしょうか。 Sub Sample()   For i = 1 To 31     If Cells(2, i).Value = 2 Then Cells(3, i).Value = "公"   Next i End Sub

arishia0307
質問者

お礼

シンプルでわかりやすくて助かります。 ありがとうございました。

関連するQ&A

  • エクセルのVBAで質問があります。

    現在自分はカレンダーを作成していて、カレンダーに祝日を入れたいと思っています そこで これを if文もしくはselectcase どっちを使ったら楽か教えてもらいたいです Sub MakeCalendar(hi As Date) Dim i As Integer 'カレンダーにセットする日付 Dim g As Integer '日付をセットする行番号 Dim r As Integer '日付をセットする列番号 Dim lastDay As Integer '作成するカレンダーの月末 g = 2 'その月の開始曜日を算出 r = Weekday(DateSerial(Year(hi), Month(hi), 1), vbSunday) '指定された日付の翌月1日をもとて、日付の前の日を計算する lastDay = Day(DateSerial(Year(hi), Month(hi) + 1, 1) - 1) For i = 1 To lastDay 'iに日付の設定 Cells(g, r).Value = i If r = 7 Then r = 1 '戻して g = g + 1 '1行下に書く Else r = r + 1 '1列→に移動する End If Next End Sub Sub test() Range("A2:G7").Value = "" 'A2~G2にカレンダー表示 MakeCalendar Range("I2").Value 'I2に日付を入力する End Sub Sub test() Range("A2:G7").Value = "" 'A2~G2にカレンダー表示 MakeCalendar Range("I2").Value 'I2に日付を入力する End Sub このようなマクロを組んでいまして、祝日(ゴールデンウィークなど)を赤で塗りつぶすような物を考えています。 VBAは初心者でまだあまりわかっていないので、ご教授ください

  • VBAで処理フラグの立て方

    こういった条件でやりたいのですがうまくいきません・・・ 処理フラグの立て方は間違っていないと思うのですが・・・ ちょっとセルとかは変えてあります。 もしE3の値が4で割り切れたら8行目を削除し次の処理は行わない もしE3の値が4で割り切れなかったらE4の値が4で割り切れるか処理をする。 割り切れたら18行目を削除 E3とE4の値両方が4で割り切れなかったら8行目を削除し1行あがるので17行目を削除したいです Sub rdlt() If Range("I1").Value = 0 Then Range("I1").Value = 1 '処理は一度きり If Range("E3").Value Mod 4 = 0 Then Rows("8:8").delete '4で割れたとき8行目を削除 Range("J1").Value = 1 '4で割れたときは次の処理用にフラグ End If If Range("J1").Value = 0 Then 'E3が4で割れなかったときは処理する If Range("E4").Value Mod 4 <> 0 Then Rows("18:18").delete Range("J1").Value = 1 End If End If End If End Sub

  • 行に色を付ける

    本を片手にやっているのですが 分かっている人にしたらあほみたいなことなんでしょうがよろしくお願いします。 A列には日付B列には曜日(WEEKDAY関数で日曜が1)を入力してあります。土日の行ににピンクを塗りつぶしたいのですが Sub iro() Dim i As Integer, gyou As Long gyou = Range("b65536").End(xlUp).Row For i = 2 To gyou If Range("b65536").End(xlUp).Value = 1 Or 7 Then Rows(i).Interior.ColorIndex = 7 Else Exit For End If Next End Sub なんとなくここまでできたのですが、これだと 全部の行に色がついてしまいます。 何がいけないのでしょうか? よろしくお願いします。

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

  • エクセル2010、VBAや関数について

    Private Sub CommandButton1_Click() Worksheets("商品マスタ").Activate Application.Calculation = xlCalculationManual If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData ActiveWindow.ScrollRow = 3 Range("AI1:AQ4").ClearContents Range("AI1:AQ4").NumberFormatLocal = "@" Range("AJ2:AK2").Value = Range("B2:C2").Value Range("AL2:AM2").Value = Range("D2").Value Range("AO2").Value = Range("E2").Value Range("AP2").Value = Range("V2").Value Range("AQ2").Value = Range("W2").Value Range("AN2").Value = Range("D2").Value If Me.TextBox1.Value <> "" Then ' コード Range("AK3").Value = "*" & Me.TextBox1.Value End If If Me.TextBox2.Value <> "" Then ' メーカー Range("AL3").Value = "*" & Me.TextBox2.Value & "*" End If If Me.TextBox3.Value <> "" Then ' <--シリーズ Range("AM3").Value = "*" & Me.TextBox3.Value & "*" End If If Me.TextBox4.Value <> "" Then ' <--サイズ Range("AN3").Value = "*" & Me.TextBox4.Value & "*" End If If Me.TextBox5.Value <> "" Then ' 入荷日 Range("AJ3").Value = Me.TextBox5.Value End If If Me.TextBox9.Value <> "" Then ' 仕入れ先 Range("AP3").Value = Me.TextBox9.Value End If If Me.TextBox12.Value <> "" Then ' 単体価格 Range("AQ3").Value = Me.TextBox12.Value End If If Me.TextBox6.Value <> "" Then ' 在庫数 Range("AO3").Value = Me.TextBox6.Value End If If Cells(3, Columns.Count).End(xlToLeft).Column > 34 Then Range("A2:W" & Rows.Count).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=Range("AI2").CurrentRegion, Unique:=False End If Range("AI1:AQ4").ClearContents ActiveWindow.ScrollColumn = 4 Range("A2").Activate Application.Calculation = xlCalculationAutomatic End Sub このようなマクロを組んでいるのですが、とても反応が遅いのですが、 シートにはA4-AG2000にデータが入っていて、 G4-U2000には =SUMIFS('[在庫.xlsx]02'!$AD:$AD,'[在庫.xlsx]02'!$AQ:$AQ,$A421,'[在庫.xlsx]02'!$AS:$AS,$F$2,'[在庫.xlsx]02'!$AT:$AT,G$2) このような関数が入っております。 これが原因で、動作が遅くなっているのでしょうか? 行の挿入等もとても遅いのですが、 G-U列の関数をやめてVBAで転記してから、検索をかけたら、早くなるのでしょうか? G-U列には関数での表記しかわからなかったため、関数をいれております。 解決法があれば教えてください。

  • EXCEL 異なるVBA

    教えて下さい、EXECL以下の異なるVBA (A>,B>)が2つあります、同じシートでそれぞれ動くようにさせたいです1つに合わせる事は出来ないでしょうか? 当方初心者の為わかりません教えて下さい。 A> Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Address(0, 0, xlA1, 0) <> "A1" Then Exit Sub With Range("F9:I9,K17:K36").Borders(xlDiagonalUp) If Left$(Target.Value, 1) = "S" Then .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic Else .LineStyle = xlNone End If End With End Sub B> Private Sub Worksheet_Change(ByVal Target As Range) With Sheet2 Select Case Target.Address Case Is = "$D$1" .Range("A1").Insert Shift:=xlDown .Range("A1").Value = Target.Value Case Is = "$D$2" .Range("B1").Insert Shift:=xlDown .Range("B1").Value = Target.Value End Select End With End Sub

  • vba 曜日のデータ

    どなたか教えて頂ければ幸いです。 以下のようなコードがあります。これは、1~31迄の日付シートに あらかじめ用意されている日~土までの曜日シートの内容を 自動的にコピーしようとしているものです。 日付シートのB5には weekday()関数とユーザー定義の書式のaaaにより 日曜日なら「日」、月曜日なら「月」が入っています。 ですが、下の「<------」の箇所は、エラーではありませんが、 一致確認がなされていません。weekday()関数の戻り値を文字列と して見ていないのでしょうか? Sub test() Dim ws As Worksheet Dim i As Integer For Each ws In Worksheets  For i = 1 To 31   If ws.Name = CStr(i) Then   ws.Select    If ws.Range("B5") = "日" Then      <-----     Worksheets("日").Range("A1:D3") _       .Copy Destination:=ws.Range("A7")       ws.Tab.ColorIndex = 45    ElseIf ws.Range("B5") = "月" Then    <-----     Worksheets("月").Range("A1:D3") _     .Copy Destination:=ws.Range("A7")     ws.Tab.ColorIndex = xlNone

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • excel vba ジャンプ

    excel2003のUserFormにてtextbox作成しました。 textbox1にページを入力すると指定のページにジャンプする コードを作成したのですが、動作的には目的とする事ができました。 ただ、初心者レベルで作成したので、コード記述が長く、 ページが増えるたびにコードを追記していかなければなりません。 下記に作成したコードを記述します。 もっと簡単に記述する方法はありますか? ---------------------------------------------------------- Private Sub TextBox1_Change() If TextBox1.Value = 1 Then ActiveWindow.ScrollRow = 1 ActiveWindow.ScrollColumn = 1 Range("$A$15").Select End If If TextBox1.Value = 2 Then ActiveWindow.ScrollRow = 38 ActiveWindow.ScrollColumn = 1 Range("$A$38").Select End If If TextBox1.Value = 3 Then ActiveWindow.ScrollRow = 69 ActiveWindow.ScrollColumn = 1 Range("$A$69").Select End If If TextBox1.Value = 4 Then ActiveWindow.ScrollRow = 100 ActiveWindow.ScrollColumn = 1 Range("$A$100").Select End If If TextBox1.Value = 5 Then ActiveWindow.ScrollRow = 131 ActiveWindow.ScrollColumn = 1 Range("$A$131").Select End If End Sub ---------------------------------------------------------- 上記記述で行っていることは、 textbox1に 1 と入力すると1ページ目が表示  キーボードでctrl+Homeの操作をした状態でカーソルがA15選択 textbox1に 2 と入力すると2ページ目が表示  表示の先頭が38行目、カーソルがA38選択 ページの行数が1ページ目だけ37行 2ページ目以降が31行ごとです。 実際は、200ページ以上あるのでなんとかしたいのですが・・・・

専門家に質問してみよう