ここから本文です

マクロについてです。 エクセルのC5~D15に表があり、C列にデータを入力しますが...

アバター

ID非公開さん

2018/10/2219:03:05

マクロについてです。
エクセルのC5~D15に表があり、C列にデータを入力しますが、毎日埋まる行が変わります。
入力したら、以下余白となるよう設定したいのですが、


Dim rngArry(3) As

Range
With ActiveSheet
Set rngArry(0) = .Range("C5") '
End With

Dim i As Long, lastrow As Long, lastcolumn As Long
For i = 0 To UBound(rngArry)
With rngArry(i)
lastrow = .CurrentRegion(.CurrentRegion.Count).Offset(1, 0).Row
lastcolumn = rngArry(i).Column
Cells(lastrow, lastcolumn).Value = "以下余白"
End With
Next i

と入力しても作動しません。
直すところを教えていただけないでしょうか。

閲覧数:
30
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

kik********さん

2018/10/2411:46:46

まず、提示あったのは

Dim rngArry(3) As Range で領域確保して
Set rngArry(0) = .Range("C5") で、0 だけに設定しているので
For i = 0 To UBound(rngArry) の 1 ~ はエラーに・・・無駄

> .CurrentRegion(.CurrentRegion.Count).Offset(1).Row
これは、もっと簡単に考えられたらと

C5:D15 すべて埋まっていたとすると、
.CurrentRegion.Count = 22
.CurrentRegion(22) は、22 個目のセル(=D15)
それの .Offset(1).Row は 16

同じ 16 を求める別の方法は
.CurrentRegion.Rows.Count + .Row
これは、11 + 5 ですね

lastcolumn = rngArry(i).Column

lastcolumn = .Column

16 行、3 列目・・・・これが得られて
Cells(16, 3).Value = "以下余白"

この時の Cells はアクティブシートが対象
rngArry(0) には、アクティブシートの C5 を設定していたから、
たまたま動くものになるのかも・・・
Cells と rngArry(0) のシートを関連付けるには、
.Worksheet.Cells(lastrow, lastcolumn)・・・・ とすれば

それよりも、たった11行処理するだけなので、
For ・・・ Next で処理すれば、いろいろな変更も容易かと


1)11行分を単にループし、空白が見つかったら

Dim i As Long

With ActiveSheet.Range("C5")
   For i = 1 To 11
      With .Cells(i, 1)
         If (.Value = "") Then
            .Value = "以下余白"
            Exit For
         End If
      End With
   Next
End With


2)間違って2度実行しても良いように、以下余白 の判別を入れる
以下余白 を2か所で使うので、同じ文字列? ・・・ Const で

Dim i As Long
Const CMM As String = "以下余白"

With ActiveSheet.Range("C5")
   For i = 1 To 11
      With .Cells(i, 1)
         If (.Value = "") Then
            .Value = CMM
            Exit For
         ElseIf (.Value = CMM) Then
            Exit For
         End If
      End With
   Next
End With


上記 1)2)では、C 列のみの判定
提示あった .CurrentRegion(.CurrentRegion.Count) の動きとチョッと違う
以下余白 は、D 列も空白だった時に・・・・

3)D 列の状況も加味して

Dim i As Long
Const CMM As String = "以下余白"

With ActiveSheet.Range("C5")
   For i = 1 To 11
      With .Cells(i, 1)
         If (.Offset(, 1).Value = "") Then
            If (.Value = "") Then
               .Value = CMM
               Exit For
            ElseIf (.Value = CMM) Then
               Exit For
            End If
         End If
      End With
   Next
End With


4)複数処理できるように

Dim rng(2) As Range
Dim i As Long, j As Long
Const CMM As String = "以下余白"

With ActiveSheet
   Set rng(0) = .Range("C5")
   Set rng(1) = .Range("F5")
   Set rng(2) = .Range("I5")
End With

For j = 0 To UBound(rng)
   With rng(j)
      For i = 1 To 11
         With .Cells(i, 1)
            If (.Offset(, 1).Value = "") Then
               If (.Value = "") Then
                  .Value = CMM
                  Exit For
               ElseIf (.Value = CMM) Then
                  Exit For
               End If
            End If
         End With
      Next
   End With
Next


上記例では、
      For i = 1 To 11
と、指定した1行目から判別していたけど、2行目から・・・なら
      For i = 2 To 11
と変更するとか・・・

アバター

質問した人からのコメント

2018/10/24 13:30:54

詳しく有り難うございます。
やってみます!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

tra********さん

2018/10/2220:06:46

何をなさりたいのか良く解らないです。

C列の最終行下に文言を表示したいのなら

Cells(Rows.Count, 3).End(xlUp).Offset(1).Value = "以下余白"

とか

Range("C5").End(xlDown).Offset(1).Value = "以下余白"

とかですが、それ以上のなにかが必要なんですか?

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる