Excelのセルの比較について

このQ&Aのポイント
  • Excelのマクロにてセルの比較を行う方法について解説します。
  • セルの表示形式が異なる場合にも正しく比較する方法をご紹介します。
  • セルの値を比較する際には、Valueプロパティを使用すると便利です。
回答を見る
  • ベストアンサー

Excelのセルの比較について

Excelのマクロにてセルの比較を行っています。 A1に"123" A2をハイパーリンクに指定して"123"と表示しています。 表示形式はどちらも通貨で表示しています。 If Range(A1).Value <> Range(A2).Value Then   MsgBox "同じではない" Else   MsgBox "同じ" End If と比較しているのですが"同じではない"が表示されてしまいます。 試しに MsgBox Range(A1).Value と MsgBox Range(A2).Value を表示してみたところ、どちらも"123"と表示されました。 セルに表示されている値で比較するにはどうしたらいいのでしょうか?

  • WDY
  • お礼率85% (188/219)

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

No.1です。 結局の所、文字列と数値を比較している事が原因の様に思えます。 .Valueではなく、.Textで文字列同士を比較するか、一旦どちらもlong型にでも変換して比較すれば良いのではないでしょうか。 If Range("A1").Text <> Range("A2").Text Then  MsgBox "同じではない" Else  MsgBox "同じ" End If Excelは型に拘らずに演算や比較が出来てしまう場合が多いですが、時々こんな事があります。

WDY
質問者

お礼

書き込みありがとうございます。 申し訳ございません。ま、まさかこんな簡単なことで・・・ お騒がせしました。ありがとうございます。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

A1という変数に"A1"、A2という変数に"A2"が入っていると言うことなのでしょうか? >If Range(A1).Value <> Range(A2).Value Then  → If Range("A1").Value <> Range("A2").Value Then ということではないのかなぁ? 試しに、MsgBox(Range(A1).Value & " / " & Range(A2).Value) とでもしてみれば、状況がわかると思いますが…

WDY
質問者

補足

書き込みありがとうございます。 申し訳ございません。 質問内容が分かりやすくする為、簡略化して記述したのですが記述ミスでした。 実際の比較式は繰り返し比較をしています。 Public row As Double '行数カウント用 Public colum As Integer '列数カウント用 (中略) '比較条件↓ If Range(ColumnNumToColumnName(colum) & row).Value <> Range(ColumnNumToColumnName(colum - 1) & row).Value Then (終略) '列番号を列名に変換 '引数:列番号 Public Function ColumnNumToColumnName(ColNum As Integer) As String Dim ColumnName As String '列の範囲チェック(存在しない列番号の場合は、UnKnownを返す) If ColNum >= 1 And ColNum <= 256 Then ColumnName = Mid(Cells(1, ColNum).Address, 2, InStr(Cells(1, ColNum).Address, "1") - 3) Else ColumnName = "UnKnown" End If ColumnNumToColumnName = ColumnName End Function という書き方をしています。 >試しに、MsgBox(Range(A1).Value & " / " & Range(A2).Value) >とでもしてみれば、状況がわかると思いますが… 表示して見たところ If Range(ColumnNumToColumnName(colum) & row).Value <> Range(ColumnNumToColumnName(colum - 1) & row).Value Then MsgBox Range(ColumnNumToColumnName(colum) & row).Value & "/" & Range(ColumnNumToColumnName(colum - 1) & row).Value End If 123/123と表示されました。 あれれ・・・?

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

> A2をハイパーリンクに指定して"123"と表示しています。 ↑ 補足願います。 リンク先の別名を"123"と表示していると言うことでしょうか? その場合、別名は文字列になると思いますので表示形式で通貨を指定しても文字列のままだと思います。 できれば、A2にはどの様なリンクが貼られているのか示してください。

WDY
質問者

補足

説明が不足していて申し訳ございません。 >リンク先の別名を"123"と表示していると言うことでしょうか? はい、別名で"123"と表示しています。 >その場合、別名は文字列になると思いますので表示形式で通貨を指定しても文字列のままだと思います。 その通りだと思います。 混乱を招く書き方をしてしまい申し訳ございません。 この比較は元のファイルからコピーをしてハイパーリンクを張っているので元のファイルの表示形式をが通貨の為、通貨で表示しています。 比較対照が両方とも同じ形式で比較をしている事を記述する為に質問に入れました。 >できれば、A2にはどの様なリンクが貼られているのか示してください。 実際のコードだと分かりにくくなってしまう為、簡略化して記述してしまい申し訳ございません。 =HYPERLINK(CELL("address",INDEX([○○○.xls]XXX!$1:$65536,MATCH("*『条件』*",[○○○.xls]XXX!$B:$B,),MATCH("『条件2』",[○○○.xls]XXX!4:4,))),"123")

関連するQ&A

  • EXCEL VBA 比較方法

    こんばんは。 EXCEL VBAで、SUM関数で時間の合計を求めたセル(B15)と8:00 を比較して、8:00より大きければメッセージを表示するとしたいのですが、上手くいきません。また、メッセージ後「はい」の場合は、そのままElseの作業を続行。「いいえ」を押した場合は、セル(b2)を選択し、VBA画面が出てくるのを避けたいのです。 勉強途中でいろいろとお聞きし申し訳ありませんがよろしくお願い致します。 IF ~Then ~~~~ ElseIf Range("B15").Value > "8:00" Then MsgBox "8時間を越えています。" Else Range(Range("b65536").End(xlUp).Offset(0), "c22").Copy

  • セルには何も入ってないのに、数値型になる理由は?

    セルに何も入ってない状態で Sub Macro() If IsNumeric(Range("a1").Value) = True Then MsgBox "A1には数値が入ってます" End If End Sub を実行すると、 "A1には数値が入ってます" が表示されます。 なぜでしょうか? Sub Macro2() MsgBox TypeName(Range("a1").Value) End Sub を実行すると、stringが返ってきます。

  • ExcelVBA 二つのセルに入力された時の判定

    セルA1とA2両方に値が入力された時、セルA3に文字を入力するマクロを作りたいです。 下記プログラムで試しているのですが、ステップインで見ると最初のIFでTrue判定されてしまいます。 どうすればこの条件を満たすマクロになるのか、教えて頂けないでしょうか。 以上、宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Or Intersect(Target, Range("A2")) Is Nothing Then Exit Sub Else If Range("A1").Value <> "" And Range("A2").Value <> "" Then Range("A3").Value = "入力済み" End If End If End Sub

  • NumberFormatLocalの値を比較したい

    Excel VBA:円記号の入った「NumberFormatLocal」の値を比較したい 以下の例で文字「バックスラッシュ」はVBAでは「円記号」で表示されています。 セルに設定された書式Selection.NumberFormatLocalの値が文字列「"\#,##0;\-#,##0"」に等しいか調べたいがうまく比較できない。 環境、OS:Windows10, Windows8、Excel:2010,2013 例 セル”A1”に数値「123456」を入力 “A1”に手作業で通貨書式を設定 「セルの書式設定」->「表示形式」->「通貨」->「\-1,234」(黒色:デフォルト) マクロの記録は Sub Macro1() Range("A1").Select Selection.NumberFormatLocal = "\#,##0;\-#,##0" End Sub “A1”に設定された書式が通貨書式であるかをVBAで確認するために プロシジャー test1 を作り、実行すれば”No”になる。 “Yes”を予想してしまうが、”No”になる理由と解決方法が知りたい。 Sub test1() Dim strTuka As String strTuka = "\#,##0;\-#,##0" Range("A1").Select MsgBox Selection.NumberFormatLocal If Selection.NumberFormatLocal = strTuka Then MsgBox "Yes" Else MsgBox "No" End If End Sub どなたか、アドバイスをお願いします。

  • エクセルVBA記述誤りの解決お願い

    A1~A20のセルに入力データが一切無い場合に、入力を促すメッセージを表示させるマクロを作りましたが,「実行時エラー13  型が一致しません」のエラー表示が出ます。 デバックすると下記マクロの「If Range("A1:A20").Value = "" Then」の部分でストップしていました。 いろいろとやってみましたが、うまくゆきません。 If Range("A1:A20").Value = "" Then MsgBox ("参加マークーを入力ください") Exit Sub End If 記述上の誤りがあるようですので、ご教示いただけましたら幸いです。

  • エクセルで特定のセルへの直接入力だけを禁止したいんです。

    過去の質問を参考に『セルをダブルクリックすると"○"と入力される』というマクロを○⇒●⇒-⇒  ⇒○⇒・・・として使っているんですが、ダブルクリックの度にセルが直接入力の状態(縦の棒の点滅)になってしまい、一度他のセルをクリックしないと次へ進めずに困っています。 良い方法ってあるのでしょうか? ちなみに使用しているマクロは Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const rng As String = "A1:A3" '処理対象のセル範囲 If Not Application.Intersect(Target, Range(rng)) Is Nothing Then If Target.Value = "" Then Target.Value = "○" ElseIf Target.Value = "○" Then Target.Value = "●" ElseIf Target.Value = "●" Then Target.Value = "-" Else Target.ClearContents End If End If End Sub というものです。 よろしくお願いします。

  • エクセルマクロ セル内の値の抜き出しと入力の値との

    すみません、ハマっております。 下記マクロにて、A2セル内にある(例)「111-22222-5555-666-1」の中のと入力した5555とのマッチングのマクロを作っているのですが、どうしてもA2値がemptyになってしまいうまくマッチングできません。どうしたらよいでしょうか?お力お貸しください。 Private Sub CommandButton1_Click() Unload 番号入力 Dim OdrNum As String If TextBox1.Value = "" Then Exit Sub Else OdrNum = TextBox1.Value While Mid(A2, 11, 4) <> OdrNum '該当番号の欄になるまで不要行削除 If Mid(A2, 11, 4) = "" Then MsgBox "該当番号はありませんでした。" Exit Sub Else End If Rows("2:2").Select Selection.Delete Shift:=xlUp Wend MsgBox "処理終了" End If End Sub

  • 検索後のセルの選択を正しくしたい

    Excel2007でマクロ作成中の初心者です。 以下のコードの中で(1)のところがうまく作動できません。 ここの ActiveCell.Select を正常にするにはどうしたらよいかご教示をお願いします。 Sub 最終日の検索() Dim FC As Range Dim mydate As Date mydate = Range("BQ5").Value For Each FC In Range("BR30:BR300") If FC.Value = DateValue(mydate) Then Exit For End If Next If FC Is Nothing Then MsgBox "みつかりませんここでおわりです" Exit Sub End If MsgBox "見つかりました" & vbLf & FC.Address(0, 0) & vbLf & FC.Value ' ' ここに処理を追加したい ActiveCell.Select ’----------(1) Selection.Offset(0, 45).Select ActiveCell.Select 貼付けしてあるかどうか Set FC = Nothing End Sub ---------------------------------- Sub 貼付けしてあるかどうか() If ActiveCell.Value = "※※" Then MsgBox " 既に貼付けしてあります" Else MsgBox "貼付けしてないので処理します" End If End Sub

  • エクセル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 -----------------------------------------------------------------

  • マクロの簡素化

    下記マクロです。 Range("AE6:AE1005").Select Selection.ClearContents Selection.Interior.ColorIndex = xlNone If Range("AD6").Value > 5 Then Range("AE6") = "*" Range("AE6").Select With Selection.Interior .ColorIndex = 3 End With Else End If If Range("AD7").Value > 5 Then Range("AE7") = "*" Range("AE7").Select With Selection.Interior .ColorIndex = 3 End With Else End If If Range("AD8").Value > 5 Then Range("AE8") = "*" Range("AE8").Select With Selection.Interior .ColorIndex = 3 End With Else End If 中略(セルを一個づつ指定しています) If Range("AD1004").Value > 5 Then Range("AE1004") = "*" Range("AE1004").Select With Selection.Interior .ColorIndex = 3 End With End If If Range("AD1005").Value > 5 Then Range("AE1005") = "*" Range("AE1005").Select With Selection.Interior .ColorIndex = 3 End With Else End If Range("AE3").Select 有るセルを参照しその値が5以上だったら別のセルに*マークとセルに色を付けるマクロですが、一個づつセル指定をしていますが、何とか短く出来ないでしょうか? お分かりになる方宜しくお願い致します。

専門家に質問してみよう