痔になりやすい生活習慣とは?

マクロ初心者です。
文字を検索する列の範囲はD~Fとし、検索開始セルはDとします。
検索結果を表示するセルの先頭セルはAとし、A~Cに結果を表示させます。
もしD2に文字があった場合、A1に”1”を表示させます。
E3に文字があった場合は、A3に”1”を、B3に”1”を表示。
E5に文字があった場合、E列に文字が入ったのが2回目となる為、A5に”1”を、B5に”2”と表示。

上記のように、それぞれの列に何個文字があったのかカウントしていくマクロを作成したいのですが、作成できずに困っています。
よろしくお願いします。

「文字の入っているセルをカウントしていくマ」の質問画像

A 回答 (4件)

失礼しました。


2行目が開始行であるところを、1行目からと見間違え、
ご質問者の文章と画像が1行ズレていると勘違いしておりました。

ですが、C5、C6に1が入っていないように見えますが。


【関数で処理】

A2セルに「=IF(COUNTA(D$2:D2)=0,"",COUNTA(D$2:D2))」を入力して
C6までオートフィル(コピー)してください。

【VBAで処理】

(1)エクセル関数を使用するなら

Sub test1()
Dim cnt As Long, i As Long, j As Long
For i = 1 To 3
For j = 2 To 6
Cells(j, i).ClearContents
cnt = WorksheetFunction.CountA(Range(Cells(1, i + 3), Cells(j, i + 3)))
If cnt > 0 Then Cells(j, i) = cnt
Next j
Next i
End Sub

(2)数えるなら

Sub test2()
Dim cnt As Long, i As Long, j As Long, l As Long
For i = 1 To 3
For j = 2 To 6
Cells(j, i).ClearContents
For l = 1 To j
If Cells(l, i + 3) <> "" Then
Cells(j, i) = Cells(j, i) + 1
End If
Next l
Next j
Next i
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
教えていただいた内容で無事に作成できました!

お礼日時:2014/05/28 20:53

>もしD2に文字があった場合、A1に”1”を表示させます。


>E3に文字があった場合は、A3に”1”を、B3に”1”を表示。
>E5に文字があった場合、E列に文字が入ったのが2回目となる為、A5に”1”を、B5に”2”と表示。

画像は現状(上手くできていない状態)でしょうか?
目的(最終形)でしょうか?


>E5に文字があった場合、E列に文字が入ったのが2回目となる為、A5に”1”を、B5に”2”と表示。

目的であると解釈するのであれば、質問内容と異なっております。
画像ではB5に「3」、質問内容では「2」


■画像の結果を表現したいのであれば・・・

【関数で処理】

A1セルに「=IF(COUNTA(D$1:D1)=0,"",COUNTA(D$1:D1))」を入力して
C5までオートフィル(コピー)してください。

【VBAで処理】

(1)エクセル関数を使用するなら

Sub test1()
Dim cnt As Long, i As Long, j As Long
For i = 1 To 3
For j = 1 To 5
Cells(j, i).ClearContents
cnt = WorksheetFunction.CountA(Range(Cells(1, i + 3), Cells(j, i + 3)))
If cnt > 0 Then Cells(j, i) = cnt
Next j
Next i
End Sub

(2)数えるなら

Sub test2()
Dim cnt As Long, i As Long, j As Long, l As Long
For i = 1 To 3
For j = 1 To 5
Cells(j, i).ClearContents
For l = 1 To j
If Cells(l, i + 3) <> "" Then
Cells(j, i) = Cells(j, i) + 1
End If
Next l
Next j
Next i
End Sub



■文章の結果を表示したいのであれば・・・・

以下の仕様と解釈しております
・対象が空白であれば上の合計値を継承
・連続して文字がある部分を合計範囲としてカウント

【関数で処理】

A1のセルに「=IF(ROW()=1,IF(D1<>"",1,""),IF(AND(D1<>"",OFFSET(D1,-1,0)=""),1,IF(OFFSET(A1,-1,0)="","",IF(D1<>"",OFFSET(A1,-1,0)+1,OFFSET(A1,-1,0)))))」を入力して
C5までオートフィル。

【VBAで処理】

Sub test3()
Dim cnt As Long, i As Long, j As Long, l As Long
For i = 1 To 3
For j = 1 To 5
Cells(j, i).ClearContents
l = j
Do While Cells(l, i + 3) <> ""
Cells(j, i) = Cells(j, i) + 1
l = l - 1
If l = 0 Then Exit Do
Loop
If j > 1 And Cells(j, i + 3) = "" Then Cells(j, i) = Cells(j - 1, i)
Next j
Next i
End Sub

て感じでしょうか。
    • good
    • 0

マクロでやる理由があるのでしょうか?


関数ならA2セルに↓を入れて、A2:C6にコピーで出来ます。
=IF(COUNTA(D$2:D2)=0,"",COUNTA(D$2:D2))
    • good
    • 0

マクロを作る必要があるのでしょうか。


関数で十分かと 「=COUNTA(B:B)」 とか。

また、マクロは自動記録…ですが…VBAでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qexcelで会議室予約表の作成(マクロ)

カテ間違いしてしまいましたので再度投稿します。
よろしくお願いいたします。

上司からの依頼で困っています。

添付のような、マクロボタンを設定し、

・登録ボタンを押したら該当時間の下の表のセルが塗りつぶされる
・削除ボタンを押したら削除される
・表のセルをクリックしたら、名前、内容などが表示される

ように、することは可能でしょうか?

マクロは初心者ですが絶対に完成させろといわれてしまいました。。。

そもそも、このような作りこみは可能でしょうか?
ちなみに、この表は数人が共有して使う予定です。

以上、お願いいたします。

Aベストアンサー

> 後は削除させるのに取り掛かります。

がんばってください。
でも、さきほどのではいくらでも重複予約ができてしまいますね。
きっと上司に言われると思いますよ。

sei_s95さんががんばってる間に、わたくしはさきほどのコードにダブルブッキング防止機能を付加してみました。
こんなのはどうでしょう?

Sub 登録()
  Dim x As Long, y As Long, z As Long, i As Long
  Dim ws As Worksheet
  Dim Rng As Range, c As Range
  Set ws = Sheets("TEST")
  With Sheets("Sheet1")
    x = .Range("A2:A50").Find(What:=ws.Range("D2").Value, LookIn:=xlFormulas, _
    LookAt:=xlWhole).Row
    y = .Rows(1).Find(What:=ws.Range("D3").Text, LookIn:=xlValues, _
    LookAt:=xlWhole).Column
    z = .Rows(1).Find(What:=ws.Range("D4").Text, LookIn:=xlValues, _
    LookAt:=xlWhole).Column - 1
    Set Rng = .Range(.Cells(x, y), .Cells(x, z))
    For Each c In Rng
      If c.Interior.ColorIndex <> xlNone Then
        i = i + 1
      End If
    Next c
    
    Select Case True
      Case i = Rng.Count
      MsgBox "ダブルブッキング!!", vbCritical, "Σ( ̄ロ ̄lll) ": End
      Case i > 0
      MsgBox "指定時間の一部が予約されています。", vbCritical, "ヾ( ̄□ ̄; )ノ!": End
      Case Else
      MsgBox "予約しました。", vbInformation, "(´^∇^)σ"
    End Select
    
    With Rng
      .Interior.ColorIndex = 6
      .ClearComments
      With .Cells(1)
        .AddComment
        .Comment.Visible = False
        .Comment.Text Text:=ws.Range("A2").Value & "/" & ws.Range("D3").Text
      End With
    End With
  End With
End Sub
    LookAt:=xlWhole).Row
    y = .Rows(1).Find(What:=Range("D3").Text, LookIn:=xlValues, _
    LookAt:=xlWhole).Column
    z = .Rows(1).Find(What:=Range("D4").Text, LookIn:=xlValues, _
    LookAt:=xlWhole).Column - 1
    .Range(.Cells(x, y), .Cells(x, z)).Interior.ColorIndex = 6
    .Range(.Cells(x, y), .Cells(x, z)).ClearComments
    With .Cells(x, y)
      .AddComment
      .Comment.Visible = False
      .Comment.Text Text:=Range("A2").Value & "/" & Range("D3").Text
    End With
  End With
End Sub

> 後は削除させるのに取り掛かります。

がんばってください。
でも、さきほどのではいくらでも重複予約ができてしまいますね。
きっと上司に言われると思いますよ。

sei_s95さんががんばってる間に、わたくしはさきほどのコードにダブルブッキング防止機能を付加してみました。
こんなのはどうでしょう?

Sub 登録()
  Dim x As Long, y As Long, z As Long, i As Long
  Dim ws As Worksheet
  Dim Rng As Range, c As Range
  Set ws = Sheets("TEST")
  With Sheets("Sheet1")
    x = .Range...続きを読む

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。


人気Q&Aランキング