エクセル2007 参照セルの値が認識されない

このQ&Aのポイント
  • エクセル2007の環境で下記マクロを実行すると、アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記してもそのセルA1の値をVLOOKUP関数で参照できません。
  • マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。
  • 宜しくお願いいたします。
回答を見る
  • ベストアンサー

エクセル2007 参照セルの値が認識されない

エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

コードを拝見すると ・Sheet2のA1セルが空白だったら     ・Sheet2の3行目以下の各行に対し     ・A列の値をSheet1のA1セルに転記     ・Sheet2の名前をSheet1のB1セルに入力     ・Sheet1を印刷(現状はコメント化=無効にしているようですが)     ・Sheet2の全行に対して繰り返し(A列が空白の行は無視) ・SHeet2のA1セルが空白じゃなかったら     ・Sheet2のA1セルの値を Sheet1のA1セルに転記     ・Sheet2の名前をSheet1のB1セルに入力     ・Sheet1を印刷(現状は・・以下同文) の一連の動作を行いたいので、マクロが必要と言うことのようで。 まず、つっこんでおきたいのが・・ 「VLOOKUPの要素はどこにあるのでしょう?」と言うこと。 コードを拝見する限り、その要素は「ここには一つも無さそう」です。 Sheet1のA1に転記しても 「どこかのセルに仕込んであるVLOOKUP関数が反応しない」 と言うのであればこの式の見直しが必要ですが、 質問文中からはそれらの情報が読み取れません。 なので、「回答しようがない質問」と言わざるを選えません。 とまぁ、それだけでは何となく申し訳ないので、 本来は「他人さまのコードの添削」は趣味ではないのですが、 個人的な好みも含めて、思ったことをいくつか。 > For i = 3 To 65536 > If .Cells(i, 1).Value = "" Then Exit For 現状だと、A列が空白でも空白じゃなくても65534回、 このチェックをしてしまいますので、処理時間的に無駄です。 なので「A列を基準に最終行まで」と言う書き方、     For i = 3 To WS1.Cells(Rows.Count, 1).End(xlUp).Row こんな書き方をオススメします。 この場合は「途中にA列が空白の行を挟まない限り」、If以下は不要です。 > Set WS1 = ActiveSheet > (略) > With WS1 > (略) > WS2.Cells(1, 2).Value = ActiveSheet.Name > (略) > End With せっかく、変数WS1を定義してWithで括っているのですから、     WS2.Cells(1, 2).Value = .Name で良いですね。 (そもそも、Withが必要かどうか?はとりあえず言及しません。) > If WS1.Cells(1, 1).Value = "" Then > (略) > ElseIf WS1.Cells(1, 1).Value >= 1 Then > (略) > Else > End If 空白か空白じゃないか、と言うIf分岐ですから、     If WS1.Cells(1, 1).Value = "" Then '空白の場合     (略)     Else    'そうじゃない(空白じゃない)場合     (略)     End If で、おそらく良いと思います。 とりあえず、以上、参考までに。 ※「どこかのセルに仕込んであるVLOOKUP関数が反応しない」  に該当するのであれば、この質問は一度クローズして  現状・目標・現象などの詳細を明記した上で別に質問を立てることをオススメします。  

smanob55
質問者

お礼

>=VLOOKUP($A$1,INDIRECT(B1),3,FALSE) VLOOKUP関数の初歩を忘れてました。 検索の型をFALSEからTRUEにすることで 問題を解決することができました。 ありがとうございました。

smanob55
質問者

補足

> For i = 3 To 65536 > If .Cells(i, 1).Value = "" Then Exit For 早速、ご指摘していただきました For i = 3 To WS1.Cells(Rows.Count, 1).End(xlUp).Row に変更してみました。とても勉強になります。 ありがとうございます。 VLOOKUP関数については、補足説明を入れましたので、 よろしくお願いいたします。

その他の回答 (1)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

そのセルA1の値をVLOOKUP関数で参照できません。 シート1のA1セルの値を用いてVLOOKUP関数でどのシートのどの列の何行目のデータをどこのセルに表示させようとしているのでしょう。 シート1のA1セルの値を使ってシート2のA列で該当する行を求め、例えばそのB列の値をVLOOKUP関数で表示させようとしているとしたらシート2のB1セルの値を表示させることになっておそらく空白のセルになってしまうでしょう。 どうしてマクロを使ってそのような操作をしようとしているのか理解できませんね。

smanob55
質問者

補足

説明が漏れていましたので、追記します。 申し訳ございませんでした。 '【モジュール2】 Sub 名前の定義() i = ActiveSheet.Name ActiveWorkbook.Names.Add Name:=i, RefersToR1C1:="=C1:C14" End Sub '【モジュール】 Sub TEST() 省略・・・ If myBtn = vbYes Then 名前の定義 省略・・・ End sub ボタンを押した際に、アクティブシートに対して、名前の定義を作成し、 '【Sheet1】内の任意のセル(たとえば、セルA2)に下記の関数を入れます。 =VLOOKUP($A$1,INDIRECT(B1),3,FALSE) しかし、 >・SHeet2のA1セルが空白じゃなかったら >    ・Sheet2のA1セルの値を Sheet1のA1セルに転記 >    ・Sheet2の名前をSheet1のB1セルに入力 >    ・Sheet1を印刷(現状は・・以下同文) 空白じゃなかった場合、・Sheet2のA1セルの値を Sheet1のA1セルに転記はできるのですが上記のVLOOKUP関数が反映されません。 空白の場合は、VLOOKUP関数が反映されるので、理由がわかりません。 よろしくお願いいたします。

関連するQ&A

  • EDateエラーの回避コードをおしえてください

    Excel2007でマクロ作成中の初心者です。 セルG2の1か月前の日付が、セルM5と同じときは、「計算済みです」として それ以外は、更新しますか?のコードを作成中 Private Sub CommandButton3_Click() Dim myBtn As Integer Dim myMsg As String, myTitle As String Sheets("計算").Select If EDate(Range("G2").Value, -1).Value = Range("M5").Value Then myMsg = Format(Range("G2").Value, "ggge年m月") & "分 は計算済みです。" & Chr(13) & "これを  " & Format(Worksheets("管理").Range("D3").Value, "m月") & "分 に更新しますか?" myTitle = "単価の確認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) End If If myBtn = vbYes Then Exit Sub Sheets("計算").Select End If End Sub ここまで作ったら、If EDateのところで「コンパイルエラー」が発生します。エラー回避のコード教えてください。

  • エクセル マクロ修正

    シート1~5まであります。別に情報シートを作成しています それぞれ同じ原本から作成しています 全部のシートにA1~A10のセルに日付、B1~B10のセルに文字など入力がするところがあります 入力はA1から順番に入れていきます 例えば 保存ボタンを作成しておく シート1のA1に日付、B1に”文字”を入力し、保存ボタンをおす 情報シートに日付と内容が一致する情報がなければ、 情報シートのA列にシート名、B列に日付、C列に入力した内容が 空白のところに出力される ボタンのマクロがCommandButton1_Clickとしたら Private Sub CommandButton1_Click() 検索 End Sub 標準モジュールに Sub 検索() Dim c As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws1LastRow As Long Dim ws2LastRow As Long Set ws1 = Sheets("情報シート") Set ws2 = ActiveSheet If ws2.Range("A1").Value = "" Or ws2.Range("B1").Value = "" Then MsgBox "検索する日付もしくは語句が入力されていません。", vbCritical Exit Sub End If If ws1.Range("A1").Value = "" Then ws1LastRow = 0 Else ws1LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row End If ws2LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Row For Each c In ws1.Range(ws1.Cells(1, "B"), ws1.Cells(Rows.Count, "B").End(xlUp)) If c.Value2 = ws2.Cells(ws2LastRow, "A").Value2 Then If c.Offset(0, 1).Value = ws2.Cells(ws2LastRow, "B").Value Then MsgBox "既にデータが存在します", vbInformation Exit Sub End If End If Next ws1.Cells(ws1LastRow + 1, "A").Value = ws2.Name ws1.Cells(ws1LastRow + 1, "B").Resize(1, 2).Value = ws2.Cells(ws2LastRow, "A").Resize(1, 2).Value MsgBox "データを追加しました", vbInformation Set ws1 = Nothing Set ws2 = Nothing End Sub これを教えて頂き作っていたのですが 別のシートを作成しこのプログラムを応用していたのですが うまく起動しないため再度投稿しました 今度のやつは固定でやろうと思っていていじったのですが 別の欄の文字が表示してしまった 結合セルB2:C4に日付を入れる 結合セルL2:L30に内容を入れるようにしたいのですが ここだけのセルを参照するようにしたいのです。 どうすればいいでしょうか? 試したことAをB2にかえ、BをL2にしたら変なことになりました・・・

  • シートの選択表示が、正常にできない

    excel2007でマクロ作成中の初心者です。 困ってます助けてください。 現在、Sheets("合計表")というシートがアクティブになっています。 そして、 Private Sub CommandButton4_Click() Sheets("単価表").Select End Sub のコードを実行すると、Sheets("単価表")というシートがアクティブになります。 ところが、これに MsgBoxをつけると -------------------------------------- Private Sub CommandButton4_Click() Sheets("単価表").Select Dim myBtn As Integer Dim myMsg As String, myTitle As String myMsg = "単価表を編集しますか?" myTitle = "単価表の確認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then ’ 単価表の編集 Sheets("単価表").Select End If End Sub --------------------------------- Sheets("合計表")というシートが表示されたままで、メッセジボタンが表示され、Sheets("単価表")に変更されません。 そして、Noボタンを押すと、はじめて、Sheets("単価表").が表示されます。 そこで、最初に Sheets("単価表")が表示されてから、Msgボタンが表示されるように したいのです。どうコードをかえたらいいでしょうか。

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • エクセル マクロ

    お世話になります 在庫シ-トにC8品番 D8に仕入れ先...M8に金額とあり C9-M9(以下デ-タ-がある行)までをオ-トフィルタ-で摘出し もし C列が1ならその行すべてを 販売済シ-トのC9-M9(以下デ-タ-がある行)に貼り付けたいのですが また、保存して次回開いた時、同じ作業をして販売済シ-トの 最終行の1行下からデ-タ-を貼り付けたいのですが Sub Macro1() Dim I As Long With Worksheets("在庫").Range("B8") Dim mybtn As Integer Dim mymsg As String, mytitle As String mymsg = "全ての最終行は行は一致していますか?" mytitle = "[B]列から[N]列の確認" mybtn = MsgBox(mymsg, vbOKCancel + vbExclamation, mytitle) If mybtn = vbCancel Then End If .AutoFilter Field:=2, Criteria1:="1" .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("販売済").Range("c65536").End(xlUp).Offset(1, 0).Paste End With For I = 1 To 4 Worksheets("販売済").Columns(I).ColumnWidth = _ Worksheets("在庫").Columns(I).ColumnWidth End Sub 宜しくお願い致します

  • Excelでwatabeさんに複数のセルを参照

    Excel2007でwatabe007さんに以前に作って頂いたこのようなソースがあります。 Sub Test4() Dim LastO As Long, LastG As Long Dim i As Long, str As String Range("D3", Cells(Rows.Count, "F").End(xlUp)).ClearContents LastO = Cells(Rows.Count, "O").End(xlUp).Row Range("A3:C3").Value = Cells(LastO, "O").Resize(, 3).Value str = Range("A3").Value & Range("B3").Value & Range("C3").Value For i = 3 To LastO   If str = Cells(i, "O").Value & Cells(i, "P").Value & Cells(i, "Q").Value Then     LastG = Cells(Rows.Count, "D").End(xlUp).Row + 1     If LastG < 3 Then LastG = 3     Cells(LastG, "D").Resize(, 3).Value = Cells(i + 1, "O").Resize(, 3).Value   End If Next End Sub これにいつも格子をつけて文字がセンターになるようにしたいですがどうすればよろしいですか?解答よろしくお願いいたします。

  • VBA どこでもセル選択

    教えて頂いたVBAなのですがもう一つ Sub Macro1() Dim Ws01 As Worksheet Dim Counter As Long, i As Long, j As Long Dim INP As String Set wS = Worksheets("Sheet4") wS.Cells.ClearContents For i = 3 To ActiveSheet.UsedRange.Rows.Count INP = "" For j = Selection(1).Column To Selection(Selection.Count).Column If Cells(i, j) = 1 Then INP = INP & Cells(2, j) & "," End If Next j Counter = Counter + 1 If INP <> "" Then wS.Cells(Counter, "A") = Left(INP, Len(INP) - 1) End If Next i End Sub -------------------------------------------------------------- For i = 3 のところを3としないでどのセル(行)にも対応させたいのですが どうすればいいでしょうか?

  • VBA 値、セル操作

    お世話になります [現状] 実行させると 1列目を残して2列づつ処理をさせています Sub Macro1() Dim idxR, idxC, ptr As Integer Dim ws As Worksheet Set ws = ActiveSheet Worksheets.Add after:=ws ptr = 2 With ws .Rows(1).Copy Destination:=Range("A1") For idxR = 2 To .Range("A65536").End(xlUp).Row Cells(ptr, "A").Value = .Cells(idxR, "A").Value For idxC = 2 To 255 Step 2 If .Cells(idxR, idxC) = "" Then Exit For Else .Cells(idxR, idxC).Resize(1, 2).Copy Destination:=Cells(ptr, "B") ptr = ptr + 1 End If Next idxC Next idxR End With End Sub [判らないこと] 前7列を残して(A:G) 8列目から(H列)より9列づつ処理をさせたいのですが判らなく大変困っております。 どなたかご教授よろしくお願いします。

  • マクロ 結合セルに対しての処理方法

    いつも回答ありがとうございます。 例えば、7行目から10000行目まで、(D:E)を結合したセルに日付[yyyy/m/d]が入力されています。その入力した最終の日付を(C5:E5)の結合されたセルに表示させるようにしたいのですが、下記の記述では範囲の選択が上手くいかず、最終日が表示されませんでした。結合されたセルに対しての記述はどのようにしたら良いのでしょうか?御指導の程宜しくお願い致します。 Sub 特定のシート以外の最終履歴と次回予定日を算出する() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "一覧" Then If ws.Name <> "メニュー" Then Dim c As Integer c = 3 Do While ws.Cells(2, c).Value <> "" With ws.Cells(5, c) .FormulaR1C1 = "=MAX(R7C1:R10000C1)" If .Value = 0 Then .Value = "履歴無し" Else .Value = .Value ws.Cells(6, c) = DateAdd("d", ws.Cells(4, c + 2), DateAdd("m", ws.Cells(4, c + 1), DateAdd("yyyy", ws.Cells(4, c), ws.Cells(5, c)))) End If End With c = c + 3 Loop End If End If Next End Sub

  • Excel VBA データの入っているセルの取り出し

    Excel VBA データの入っているセルの取り出し Excel2007使用です。 大きなセル範囲の中にデータが点在している場合に、そのデータを一か所にまとめるマクロを作りたいです。セル範囲は決まっています(A1:Q100)。最終的には隣のセルの1列にまとめたいです。 以下のようなマクロを作ってみましたが、いずれも作動しませんでした(エラーメッセージも出ず) NullをEmptyに変えてみても同じでした。 (ややこしいですが、アクティブセルはSheet2、Sheet1へ貼り付けたい) (とりあえずシート内で列上部にまとめようとした) Dim myRange As Range For Each myRange In Range("A1:Q100") If myRange.Value = Null Then myRange.Delete xlShiftUp End If Next myRange End Sub (1行1列ずつの参照をループさせて「空白でない」セルを切り取り-貼り付けさせようとした) Worksheets("sheet2").Activate Dim Gyou As Integer Dim Retsu As Integer For Gyou = 1 To 100 For Retsu = 1 To 17 If Cells(Gyou, Retsu).Value = Not Null Then Cells(Gyou, Retsu).Cut Destination:=Worksheets("sheet1").Cells(5, 2) End If Next Retsu Next Gyou End Sub また、以下のマクロは、実行すると現状のままSheet1のE列以降に移るだけで、データのあるセルだけがまとまるという状態にはなりません。 Range("A1:Q100").SpecialCells(xlCellTypeVisible).Cut Destination:=Worksheets("Sheet3").Range("E1") End Sub 以下は某サイトで、まさに「空白セルを削除しデータの入ってるセルを上詰めにする」というマクロが紹介されていたので、加工してやってみましたが、「RangeクラスのDeleteメソッドが失敗しました」という実行時エラーが出てできませんでした。 Dim WS As Worksheet Dim myRng As Range Dim Lrow As Long Set WS = Worksheets("Sheet1") Lrow = WS.Range("A" & CStr(Rows.Count)).End(xlUp).Row Set myRng = WS.Range("A1:A" & CStr(Lrow)) myRng.SpecialCells(xlCellTypeBlanks).Delete xlShiftUp End Sub データの入っているセルだけを取り出して一つの列にまとめたいのですが、どうしたらいいのでしょうか。

専門家に質問してみよう