• 締切済み

VBAでワークシートのセルにIF文を入れる

こんにちは。 VBAでワークシートのセルにIF文を入れ、実行するとエラーがでます。 記述間違いでしょうか? 記述 Worksheets(h.Value).Range("D14").Formula = "=IF(ISERROR(((D5+D6+D7)/D4) = TRUE,"",(D5+D6+D7)/D4)) どこがおかしいのか、どうか教えてください。

みんなの回答

  • ytsg
  • ベストアンサー率58% (7/12)
回答No.1

Worksheets(h.Value).Range("D14").Formula = "=IF(ISERROR((D5+D6+D7)/D4) = TRUE,"""",(D5+D6+D7)/D4)" です。 ()の数が多いのと、文字列中で空白を表すには""""です。

osaryo
質問者

補足

回答ありがとうございます。 確かに()が多かったです。でも、空白は""でいいのでは? で、自分なりに考えた結果、IF分をかっこている""ですが、途中の空白を表す""を書式終わりと認識し、それがエラーになっていると原因だと思います。 ですので、""にゼロを当てはめ、書式設定でゼロを非表示にして解決しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [Excel97]VBA:セルに入っている数式を別のシートのセルに文字列としてセットする

    「ExcelVBAマクロ500連発」という技術評論社の本(青のカバー)のNo.277に 「式を文字列として表示する」というサンプルマクロがあります。 「ワークシートのセルに入っている数式を、(同じシート内の)別のセルに文字列としてセットする」 ここのコードを参考にして、 「数式を、(同じブック内の別のシートの)セルに文字列としてセットする」コードを考えています。 以下のコードを作りましたが、実行すると最後から2行目の「.Formula」のところで 実行時エラー1004:'Range'メソッドは失敗しました。'_Global'オブジェクト というエラーが出てきます。なぜでしょうか? 正しいコードの記述を教えて下さい。 (Sheet1のD3セルの計算式をSheet2のD10セルに文字列としてセット) Option Explicit Dim 調査セル As Variant Dim 報告セル As Variant Sub 式の抽出() Worksheets("Sheet2").Select 調査セル = Worksheets("Sheet1").Cells(3, 4) 報告セル = "D10" Range(報告セル).Value = "" Range(報告セル).Value = "'" + Range(調査セル).Formula End Sub

  • vba ワークシートを変数を用いて開くには

    初歩的な質問ですが、 ワークシートの書式が新しくなったことで、書き換えをすることになりました。 現在のエクセルファイルから、新しいエクセルファイルへ、セルの値を参照しながら VBAにて作業をしたいのですが、 Sub changesheet() Dim iname As String Dim wbname As String iname = InputBox("ブック名を入力", "対象ブックを入力") wbname = "シート2012(" & iname & ").xls" ActiveSheet.Range("P4").Value = Workbooks(wbname).Worksheets("Sheet1").Range("P4").Value End Sub この記載で実行すると、インデックスが有効範囲にありません とエラーになってしまいます。 変数(inputbox)を用いたセルの参照はどのように記述すればよろしいでしょうか? よろしくお願いします。

  • VBAでダブルコーテーション入りの数式をセルにセットしたい

    VBAにて下記質問があります。 複数の質問を連続して投稿するのもどうかと思い、 不慣れなもので、1投稿で2種類の質問を記載いたしましたが、 迷惑等になるのであれば、削除後複数投稿にて再度投稿したいと思いますので、遠慮なくご指摘下さい。 さて、本文ですが、 1.VBAにてExcelのあるセルに数式をセットしたいのですが、数式内にダブルコーテーションがある為、上手くセットできません。 2.VBAでRange関数のパラメータを可変にしたい。 1について、 セットしたい数式 =IF(ISERROR(VLOOKUP(H23,ini!B36:D401,3))=TRUE,"",IF(VLOOKUP(H23,ini!B36:D401,3)=0,"",VLOOKUP(H23,ini!B36:D401,3))) セットしたいセルをH44とした場合、単純に .Range("H44").Value = "=IF(ISERROR(VLOOKUP(H23,ini!B36:D401,3))=TRUE,"",IF(VLOOKUP(H23,ini!B36:D401,3)=0,"",VLOOKUP(H23,ini!B36:D401,3)))" このように書いてエラーになってしまいます。 ダブルコーテーションがあるので当然だとは思うのですが、 回避の仕方がわかりません。 また、2についてですが、 「ワークシートに書かれた値をRangeのパラメータとして代入したい。」 仮にSheet1のA2のセルにA~Fまでのいづれかの値が入るものとする。 Range関数の列の指定はA2の値を参照し、代入したい。 A2の値:C worksheets("sheet1").Range("〇1”).Value 〇にCが入るようにしたい。 当然、A2がFになったらFが代入されるようにしたい。 色々検索し、調べてみたのですが上手く見つけられませんでした。 VBA初心者である為、上記説明が分かりづらいかもしれませんが、 分かる方おりましたら、ご教授の程、よろしくお願い致します。

  • Excel、VBAのIF文で

     いつもお世話になります。 エクセルのVBAでセルF4からF65536までを選択していれば印刷して、それ以外を選択していれば「氏名セルを選択してください」と表示させたいのですが、うまくいきません。  全く構文かもしれませんが以下が作成したプロシージャです。VB初心者です。ご指導よろしくお願いします。 Sub 成績個人印刷if() If Range("f5,f65536").Activate = True Then Worksheets("個人カード").Range("a3").Value = ActiveCell.Offset(0, -4) Worksheets("個人カード").PrintOut End If MsgBox "氏名セルを選択してください" End Sub

  • IF文の作り方

    エクセル VBA 超入門のものなんですけど、質問させてください。 A1のセルに 1を入力したら、セルD1に正解を表示させ、 それ以外なら不正解を表示させたいのですが、  以下の文でつくると 実行した最初しか起動してないような気がするのですが、教えてください。どうすればセルA1を入力するたびに、 正解、不正解をD1に表示させれるでしょうか? Sub テスト() If Range("A1") = "1" Then Range("D1").Value = "正解" Else Range("D1").Value = "不正解" End If End Sub

  • エクセルvbaで同姓同名の抽出方法について

    エクセルVBAで質問があります。 ワークシート1(上段、example1)のB2のセルにひらがな(苗字)を入力したとき、ワークシート2(下段、example2)で作成して該当した情報をワークシート1のC2からe7へ反映させたいと考えています。 ワークシート2に、1000人越えの情報があり、かつ、同姓同名が何人かいて、フィルタをかけてもフィルタ結果後から目的の人を見つけるのが大変なんです。 入力したコードは、下記の通りなのですが、どこをどう直せばいいのか分かりません。どなたか教えていただけないでしょうか? Sub sample() Dim i As Byte   i = 1   If < Worksheets("example2!A2:A9").Value > = 5 Then         Worksheets(i + 4, "example2!C2:E2").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 4 < Worksheets(i + 3, "example2!A2:A9").Value > = 4 Then         Range.Worksheets("example1!C3:E3").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 3 < Worksheets(i + 2, "example2!A2:A9").Value > = 3 Then         Range.Worksheets("example1!C4:E4").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 2 < Worksheets(i + 1, "example2!A2:A9").Value > = 2 Then         Range.Worksheets("example1!C5:E5").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 1 < Worksheets(i + 0, "example2!A2:A9").Value > = 1 Then         Range.Worksheets("example1!C6:E6").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 0 < Worksheets(i + -1, "example2!A2:A9").Value > = 0 Then         Range.Worksheets("example1!C7:E7").Value = EntireRow("example2!D:F").EntireRow = True Else End If       Range("example1!B2").Value = " " End sub

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).~」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • エクセルVBAで別範囲のセル書式設定を利用したいと思っています。

    エクセルVBAで別範囲のセル書式設定を利用したいと思っています。 最近、 Worksheets("Sheet2").Range("B1:B10").Formula = Worksheets("Sheet1").Range("B1:B10").Formula のような式を覚えたので、同じようにRangeを利用して別範囲の書式をコピーしたいと考えましたが、 .Formula に換えるプロパティがわかりません。 試しに .font.bold としても反応しませんでした。 Worksheets("Sheet1").Range("B1:B10").Copy Worksheets("Sheet2").Range("B1:b10").PasteSpecial Paste:=xlPasteFormats の2行より短くはならないのでしょうか? 宜しくお願いします

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

専門家に質問してみよう