プロが教えるわが家の防犯対策術!

VBAについてです。該当しない時は"0"と表記したいのですが、どうやってもうまくいきません。。

Sub Sample()

Dim nCount, nActSheet, nName, nSheet
Dim sTargetName

nActSheet = ActiveSheet.Index
nCount = Worksheets.Count
If nCount <= nActSheet Then Exit Sub '右にシートが無ければ終了

'アクティブシートのB列の値を検査「名前」とする
For nName = 1 To Cells(Rows.Count, 2).End(xlUp).Row
sTargetName = Sheets(nActSheet).Range("B" & nName)

'右側のシートを1シートづつ検査対象シートとする
 For nSheet = (nActSheet + 1) To nCount

'検査対象シートのB列に検査「名前」があるか確認
If Application.WorksheetFunction.CountIf(Worksheets(nSheet).Range("B5:B60"), sTargetName) > 0 Then
'「名前」があればN、P列の値をアクティブシートのK、M列に入れる
With Worksheets(nSheet)
nRow = Application.WorksheetFunction.Match(sTargetName, .Range("B:B"), 0)
Range("K" & nName) = .Range("N" & nRow)
Range("M" & nName) = .Range("P" & nRow)
End With

Exit For '1つ見つかったらその「名前」の検査は終了
End If
Next nSheet
Next nName
End Sub



B5~B34までのキーを元に他のシートを検索して、KとMにデータを取得するというものです。

今は該当するものがなければ空白になってますが、それを「0」と表記したいのです。
私がそれらしい構文を入れたら関係のない所まで「0」と変換されてしまいました。

データを入力したい範囲はK列とM列の5行目~34行目までです。

上の構文のどの部分に何を付け加えたら良いのでしょうか・・?
教えてください。

A 回答 (3件)

最初に0入れちゃえばいいと思います。




'アクティブシートのB列の値を検査「名前」とする
For nName = 1 To Cells(Rows.Count, 2).End(xlUp).Row
sTargetName = Sheets(nActSheet).Range("B" & nName)

'(先に0を入れておく)
Range("K" & nName) = 0
Range("M" & nName) = 0

'右側のシートを1シートづつ検査対象シートとする
 For nSheet = (nActSheet + 1) To nCount
    • good
    • 0
この回答へのお礼

ありがとうございました。
思ったとおりに実行できました(o^-^o)

お礼日時:2010/03/18 11:39

こんにちは、参考に


Sub Test()
  Dim c As Range
  Dim ws As Worksheet
  Dim meR As Variant

  If ActiveSheet.Index = Worksheets.Count Then Exit Sub
  For Each c In Range("B1", Cells(Rows.Count, "B").End(xlUp))
    Cells(c.Row, "K").Value = 0
    Cells(c.Row, "M").Value = 0
    For Each ws In Worksheets
      If ActiveSheet.Index < ws.Index Then
        myR = Application.Match(c.Value, ws.Range("B5:B60"), 0)
        If Not IsError(myR) Then
          Cells(c.Row, "K").Value = ws.Cells(myR + 4, "N").Value
          Cells(c.Row, "M").Value = ws.Cells(myR + 4, "P").Value
          Exit For
        End If
      End If
    Next
  Next
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
そのままコピペしても思ったとおり実行できました(o^-^o)

それにしても、こんなのをサクサクっと作れちゃうってスゴイですね。
私ももっと勉強します!!

お礼日時:2010/03/18 11:49

多分ご質問の最も簡単な解決手順としては,


1.先に全部に(初期値としての)ゼロを埋めておく
2.現行のマクロで,該当データはゼロから所定の値に書き換えさせる
で十分と思われます。


その上で,ご自分でももっとマクロを勉強してみたいというお話なら。
基本的な制御構造は

 If 名前があったら
   探して転記する
 Else
   無かったのでゼロを入れる
 End If

のようになりそうです。


つまり…

<抜粋>
'検査対象シートのB列に検査「名前」があるか確認
If Application.WorksheetFunction.CountIf(Worksheets(nSheet).Range("B5:B60"), sTargetName) > 0 Then
'---『「名前」があればN、P列の値をアクティブシートのK、M列に入れる』---


Exit For '1つ見つかったらその「名前」の検査は終了

’↓ここから追加
Else
’---『「名前」が無かったので,どこかの列のどこかの行のセルにゼロを入れる』---

’このタイミングでどこにゼロを入れたいのか,ご説明ではまだ不明です
’「K列とM列の5行目~34行目まで」にゼロを入れるのでは無さそうです。

’↑ここまで
End If

もう少し検討してみてください。
    • good
    • 0
この回答へのお礼

回答有難うございました。

If 名前があったら
  探して転記する
Else
  無かったのでゼロを入れる
End If

このタイミングで私もやってみてたんですが、出来なかったので、何で!?でした。
多分「無かったのでゼロを入れる」って命令文が変だったんでしょうね(⌒_⌒;

お礼日時:2010/03/18 11:42

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