• 締切済み

VBA 任意の複数列の実行方法について

現在、次のような任意の列を参照し、任意の列へ日付を入力しています。 Private Sub Worksheet_Calculate()   For i = 1 To 100     If (Cells(i, "J") = 1) And (Cells(i, "L") = "") Then       Cells(i, "L") = Now()     End If   Next i End Sub このJ-Lの組み合わせで実行させたい列が他にも4組ほどあるのですが、 指定したい複数の任意の列への実行方法がわかりません。 どなたかおわかりになられたらご教授いただけないでしょうか。 よろしくお願いします。

みんなの回答

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>J-Lの組み合わせで実行させたい列が他にも4組ほどあるのですが Private Sub Worksheet_Calculate()   Dim i As Long   For i = 1 To 100     If Cells(i, "J").Value = 1 And Cells(i, "L").Value = "" Then       Cells(i, "L").Value = Now()     ElseIf Cells(i, "J").Value = 2 And Cells(i, "L").Value = "" Then       Cells(i, "M").Value = Now()     ElseIf Cells(i, "J").Value = 3 And Cells(i, "L").Value = "" Then       Cells(i, "N").Value = Now()     ElseIf Cells(i, "J").Value = 4 And Cells(i, "L").Value = "" Then       Cells(i, "O").Value = Now()     ElseIf Cells(i, "J").Value = 5 And Cells(i, "L").Value = "" Then       Cells(i, "P").Value = Now()     End If   Next i End Sub >J-Lの組み合わせで実行させたい列が他にも4組ほどあるのですが Private Sub Worksheet_Calculate()   Dim i As Long   For i = 1 To 100     If Cells(i, "J").Value = 1 And Cells(i, "L").Value = "" Then       Cells(i, "L").Value = Now()       Cells(i, "M").Value = Now()       Cells(i, "N").Value = Now()       Cells(i, "O").Value = Now()       Cells(i, "P").Value = Now()     End If   Next i End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

Private Sub Worksheet_Calculate()   For i = 1 To 100     If (Cells(i, "J") = 1) And (Cells(i, "L") = "") Then       Cells(i, "L") = Now()     End If     If (Cells(i, "M") = 1) And (Cells(i, "O") = "") Then       Cells(i, "O") = Now()     End If     If (Cells(i, "P") = 1) And (Cells(i, "R") = "") Then       Cells(i, "R") = Now()     End If     If (Cells(i, "S") = 1) And (Cells(i, "U") = "") Then       Cells(i, "U") = Now()     End If     If (Cells(i, "V") = 1) And (Cells(i, "X") = "") Then       Cells(i, "X") = Now()     End If   Next i End Sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA 特定セル変更時に指定セルに日付代入方法

    初心者のため、伝わるかわかりませんが、 次のような動作をVBAで行えなくて困っています。 ・行いたい事 (※前提として"行"ごとに実行します) J列が"1"だった場合、 L列にJ列が"1"になった日付(yyyy/mm/dd)を入力する ただし、J列には関数を使用し"1"と表示されているため セルの値変更ではありません。 ・現在のVBA Private Sub Worksheet_Calculate() If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then With Target.Offset(, 2) .Value = Now() .NumberFormatLocal = "yyyy/mm/dd" End With End If End Sub ※J列が関数を使用しているため、Calculateにしています。 2行目の↓の部分でエラーになってしまっています。 > If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then どなたかご教授いただけたら助かります。 よろしくお願いします。

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • VBA 超初心者

    下のプロシージャーを実行すると20秒ぐらい処理にかかります。 ステップインで見ても何度もこのプロシージャーを実行しているようです。 どうしてでしょうか? Private Sub Worksheet_Calculate()   Cells(30, 2).Value = 13 End Sub

  • VBA 請求データ一覧からの複数の処理

    先週 kkkkkmさんに質問をさせて頂きまして、 いろいろご指導を頂いたものです。 続編の様な形になってしまいますが、 抽出するデータの環境設定を変更致しました。 ご質問させて頂く内容は前回とほとんど変更がないのですが、 あらためて下記に記載させて頂きます。 <Worksheet1のデータ> J列~AM列までが課税金額 「J,K,L」「M,N,O」・・・「AK,AL,AM」と3列1組(コード・費目・金額) 1組の行もあれば、複数組の行もあり。 AN列~BB列までが非課税金額 課税金額と同じく3列1組 1組の行もあれば、複数組の行もあり。 「BC」=消費税、「BD」=合計金額 ※AN列の前に不規則な空白セルあり   BC列の前に不規則な空白セルあり 文章で上手く説明出来ているか自信がありませんので、 エクスポートした元データ Worksheet1と、 vbaを用いて作成した Worksheet3 をご参考に添付致します。 Worksheet1の2行目がWorksheet3の2行目に対応しています。 3行目、4行目も同様です。 不規則な空白が原因でしょうか・・・。 M列、O列は問題ないのですが、 金額が合わなかったり、N列に金額を引いてこないのです。 実行しているコードは下記になります。 Dim i As Long, j As Long, k As Long Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet Dim mTotal(4) As Long Dim LastRow As Long Dim List(4) As Variant Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") Set Ws3 = Sheets("請求書ひな形") List(1) = Ws2.Range(Ws2.Cells(1, "A"), Ws2.Cells(Rows.Count, "A").End(xlUp)).Value List(2) = Ws2.Range(Ws2.Cells(1, "B"), Ws2.Cells(Rows.Count, "B").End(xlUp)).Value List(3) = Ws2.Range(Ws2.Cells(1, "C"), Ws2.Cells(Rows.Count, "C").End(xlUp)).Value List(4) = Ws2.Range(Ws2.Cells(1, "D"), Ws2.Cells(Rows.Count, "D").End(xlUp)).Value LastRow = UBound(List(1)) For i = 2 To 4 If LastRow < UBound(List(i)) Then LastRow = UBound(List(i)) End If Next For i = 2 To Ws1.Cells(Rows.Count, "J").End(xlUp).Row mTotal(1) = 0 mTotal(2) = 0 mTotal(3) = 0 mTotal(4) = 0 For j = Columns("J").Column To Columns("BB").Column Step 3 For k = 2 To LastRow If UBound(List(1)) >= k Then If Ws1.Cells(i, j).Value = List(1)(k, 1) Then mTotal(1) = mTotal(1) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If If UBound(List(2)) >= k Then If Ws1.Cells(i, j).Value = List(2)(k, 1) Then mTotal(2) = mTotal(2) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If If UBound(List(3)) >= k Then If Ws1.Cells(i, j).Value = List(3)(k, 1) Then mTotal(3) = mTotal(3) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If If UBound(List(4)) >= k Then If Ws1.Cells(i, j).Value = List(4)(k, 1) Then mTotal(4) = mTotal(4) + Ws1.Cells(i, j).Offset(0, 2).Value Exit For End If End If Next Next Ws3.Cells(i, "J").Value = mTotal(1) Ws3.Cells(i, "K").Value = mTotal(2) Ws3.Cells(i, "L").Value = mTotal(3) Ws3.Cells(i, "N").Value = mTotal(4) Ws3.Cells(i, "M").Value = Ws1.Cells(i, "BC").Value Ws3.Cells(i, "O").Value = Ws1.Cells(i, "BD").Value Next Set Ws1 = Nothing Set Ws2 = Nothing Set Ws3 = Nothing End Sub 本当に何度も申し訳ございません。 お時間がある時に見て頂けると有り難いです。 どうぞ宜しくお願い致します。

  • 変化するセルが変更されたら実行、というVBAを組みたい

    たとえば、このセルが変更されたら実行、というのは Private Sub WorkSheet_change (Byval Target As Range) If(Target.Address = "$D$3") Then call *** End If End Sub のようにしますよね? この場合、指定したセルは「D3」ですが、たとえば、 A列、B列、C列、D列のアクティブの行のセルが変更されたらコード実行、 というようにするにはどうしたらいいのでしょうか?

  • エクセルVBAで複数シートにマクロ実行

    エクセル2000です。 Sub 行列非表示() For i = 2 To 120 If Cells(i, "A").Interior.ColorIndex = 3 Then Cells(i, "A").EntireRow.Hidden = True End If Next i For n = 1 To 50 If Cells(1, n).Interior.ColorIndex = 3 Then Cells(1, n).EntireColumn.Hidden = True End If Next n End Sub 上記マクロを、シートAAAとCCCとEEEに実行する場合、 Sub test() Sheets("AAA").Activate Call 行列非表示 Sheets("CCC").Activate Call 行列非表示 Sheets("EEE").Activate Call 行列非表示 End Sub と書くよりももっとすっきり実行する方法は無いでしょうか? 各シートの非表示対象の行や列はそれぞれことなります。 また Sub 行列非表示 自体も、もっと効率的にやる方法はないでしょうか?

  • VBA:Callステートメントでいつでもイベント発生可能な準備をしたい。

    タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。 Private Sub Auto_Open() MsgBox "Ctrl + t でイベント実行準備を行います。" Application.OnKey "^{t}", "実行準備SUB" End Sub '--------------------------------------------------- Sub 実行準備SUB() Dim Target As Range Target = Range(Cells(1, 1), Cells(100, 100)) Call Worksheet_Change(ByVal Target) End Sub '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 2 Then r.Offset(0, -1).Value = Now End If Next r End Sub イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • シート内の特定のセルの範囲が変化した時、

    シート内の特定のセルの範囲が変化した時、 まずA列の最大値を求めて、その後A列とD列のそれぞれの条件にあった行のA列に 最大値+1を表示させるようにしたいのですが動作しません。 なぜ動かないか教えて下さい。 参考までに、そのプログラムを記載します。 宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 3 Or Target.Row > 65000 And Target.Column = 4 Then Dim i, j, max As Integer max = 0 For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row If max < Range("A" & i).Value Then max = Range("A" & i).Value End If Next i For j = 3 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(j, 1) = "" And Not Cells(j, 4) = "" Then Cells(j, 1) = max + 1 End If Next j End If End Sub

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

専門家に質問してみよう