• ベストアンサー

EXCEL VBAでセルの値が数値のときに2を掛ける方法について

すいませんEXCEL VBAで教えていただきたいことがあります。 A1:H3000に数値及び文字列が入っている。 この範囲で値が数値のときは当該セルの値に*2の処理を行う (文字列の場合はそのまま) Dim i as Variant For Each i in Range("A1:H3000") IF ~ Next i というような流れでしょうか。 IFの後がテキスト本を見てもよくわかりませんでした。 よろしくお願いします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

どうしてもIF文で判定したければ Sub test01() Dim i As Range For Each i In Range("A1:H3000") If i.Value <> "" And IsNumeric(i.Value) Then i.Value = i.Value * 2 End If Next i End Sub でも、これじゃ全セルを判定するので非効率では? 最初から範囲内の数値だけを対象にすればIFは不要です。 ただし、ひとつも数値がなければエラーになると思いますが。 Sub test02() Dim i As Range For Each i In Range("A1:H3000").SpecialCells(xlCellTypeConstants, 1) i.Value = i.Value * 2 Next i End Sub 数値がなくともエラーがでないようにするなら Sub test03() Dim i As Range On Error GoTo line For Each i In Range("A1:H3000").SpecialCells(xlCellTypeConstants, 1) On Error GoTo 0 i.Value = i.Value * 2 Next i Exit Sub line: MsgBox "指定範囲内に数値がありません。" End Sub

takohasisa
質問者

お礼

出来ました!!ありがとうございます! 特にIFでやりたいわけではなく、IFしか思い浮かばなかっただけですので、下の式を使わせていただきました。 For Each i In Range("A1:H3000").SpecialCells(xlCellTypeConstants, 1) のやり方は知らなかったのでとても勉強になりました。 数値が入ってないことはまずないのですが、 せっかくですのでエラー処理も一応入れておきます(笑) また何かありましたらお願いいたします。

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

Dim r As Range  For Each r In Range("A1:H3000")   If r.Value <> "" And IsNumeric(r.Value) Then  '    2をかける処理 r.offset(0,1).Value = r.Value * 2   End If  Next r もし数値が入力されているセルに限定するなら  For Each r In Range("A1:H3000").SpecialCells(xlCellTypeConstants, 1)  '    2をかける処理 r.offset(0,1).Value = r.Value * 2  Next r でもよいでしょう。試してみてください。

takohasisa
質問者

お礼

できました。ありがとうございます。 SpecialCells(xlCellTypeConstants, 1)という式を自分は知らなかったので、とても勉強になりました。 またよろしくお願いいたします。

関連するQ&A

  • VBAで複数の行のナンバーを取得し、その行の列の値を参照して値を入れる

    下記のことをしたいのですが、調べてもわかりません。 どなたか教えてください。 よろしくお願いします。 内容: エクセルシートのA列の値が11である行ナンバーを取得(複数ある可能性があります)する。 その行のE列(5列目)の値と他のテーブルの値を参照して所定の値をA列の値が11である行のE列(5列目)に返す。 以下のVBAを書いてみましたがうまくいきません。 ----------------------------------------------------------------- Dim ROWCOUNT As Integer Dim row_array() As Variant Dim i As Integer '全行数を取得 ROWCOUNT=Worksheets("sheet1").Range("A1",Range("A65536").End(xlUp)).Count For i = 1 To ROWCOUNT If Cells(i, 1).Value = 11 Then Cells(i,1).Offset(0,5).Value=WorksheetFunction.VLookup(Cells(i, 1).Offset(0, 5).Value, Worksheets("sheet2").Range("A1:H1786"), 3, False) End If Next I

  • VBA セルの値13が数値だったり文字列だったり

    セルに入った「13」が数値の場合でも文字列の場合でも処理出来る方法はありませんか? 例えば If Range("A1").Value=13 Then 処理 Endif セルの値が文字列"13"の場合、同じと認識してくれません。 いい方法はないでしょうか?

  • Word vbaからexcel vbaへ値を渡すことができますか?

    Word vbaからexcel vbaへ値を渡すことができますか? 現在Wordでvbaを組んでいますが、Wordで取得した値をexcel vbaで利用したいのに変数の値がnullになってしまい四苦八苦しています。Application間で値を渡すには何か特別な処理がいるのでしょうか?(参照は設定済みです) やりたい事は、Wordで「ShipTo」文字列をsearch→後ろの番号を変数へ格納→excel vbaを起動→シートの表中からWordで取得した番号を元に文字列を検索しセルに入れる(VLOOKUPを使用)→セルの文字列をWord vbaへ返しWord側で利用、という処理です。excel vbaの起動は以下のように記述しています。 ------------------excelVBAの起動 Sub getExcelTable() Dim xLobj As Object, myObj As Object Set xLobj = CreateObject("excel.application") xLobj.Visible = True Set myObj = xLobj: workbooks.Open (ThisDocument.Path & "\sample.xls") myObj.Run ("'sample.xls'!getStr") MsgBox strA ←これがでない MsgBox strB ←これがでない Set xLobj = Nothing End Sub -----------------excel vbaのコード Option Explicit Dim endRow As Integer, ShipTo As Variant Dim strA As Variant, strB As Variant Sub getStr() endRow = Range("a65536").End(xlUp).Row MsgBox ShipTo ←これがでない Cells(endRow + 2, 1).Select Selection.Value = "=VLOOKUP(" & ShipTo & ",$A$1:$T$" & endRow & ",3,0)" strA = ActiveCell.Text Cells(endRow + 2, 2).Select Selection.Value = "=VLOOKUP(" & ShipTo & ",$A$1:$T$" & endRow & ",13,0)" strB = ActiveCell.Text End Sub Word vbaからexcel vbaは起動します。Word側、excel側で使う関数はグローバル変数にし、variant型にしてみましたが値がわたりません(Wordでは取得できています)。Application間で値を渡す方法、もしくは根本的にもっとうまい方法があればご教示ください! WinXP、Office2003を使用です。

  • ExcelのVBAで・・・

    VBA初心者です。。 Excelのある列のセルの値が全角文字の場合に、 隣の列に全角カタカナに変換した値を転送するVBAがあります。 変換元の列の中に空白セルがあった時は変換先のセルに 文字があっても空白に置き換えたいのですが、方法がわかりません・・・。 使用しているVBAの内容は下の通りですが、どういう風に 修正すれば実現できるかアドバイスを頂けないでしょうか? よろしくお願い致します!   Dim C As Range   For Each C In Range("E3", Range("E65536").End(xlUp))     If C.Value <> "" Then _     C.Offset(, 1).Value = Application.GetPhonetic(C.Value)   Next

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • エクセルVBAのFunctionプロシージャの質問

    エクセルのFunctionプロシージャを使って以下のユーザー定義関数を作りたいのですが上手くいきません。 アドバイスお願いしますm(__)m やりたいこと エクセルのA列とB列に複数の(たとえば10行の)数字が並んでいます。 各行ごとに 0.5×[A列の値]×[B列の値の二乗] を算出し、その合計を求めたいです。 別の列(例えばC列)を使って上記の計算式を入力し、その合計を求めればよいのですが どうしてもFunctionプロシージャを使って1セルだけを使って求めたいのです。 自分はVBA(エクセルマクロ)はあまり詳しくないのですが 色々ネットで調べた結果、以下のようなプロシージャを書いてみたのですが 上手く計算できません。 Function KE(element As Range) Dim e As Range Dim m() As Variant Dim v() As Variant Dim ans As Integer i = 0 j = 0 For Each e In element If i = j Then m(i) = e.Value i = i + 1 Else m(j) = e.Value j = j + 1 End If Next e k = i i = 0 j = 0 While i < k + 1 ans = ans + 0.5 * m(i) * v(i) * v(i) i = i + 1 Wend KE = ans End Function もちろん、この形に拘りません Functionプロシージャを使ってうまく計算できる方法ありましたらご教示お願いします。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • VBA 文字列と数値の混在

    Excel VBA 独学中の初心者です。独学中の初心者です。 データ型に関する以下の疑問についてお答えいただける方、よろしくお願い致します。 疑問1.「文字列 & 数値」でエラーにならず、結果は文字列になるようですが、これはVBAの規則上当たり前のことでしょうか。 疑問2.InputBox関数の戻り値は、Typeを省略した場合文字列と思いますが、これを数値型の変数に代入してもエラーは発生しませんでした。これも当たり前のことでしょうか。 具体例は以下です。 ------------------ Option Explicit Sub 文字列と数値の疑問() '初期設定 Cells.Clear Range("A1").Select '本題はここから Dim i As Long Dim j As Long Dim strRange As String Dim strInput As String '------------------ '疑問1の例 i = 2 strRange = "A" & i '疑問1:文字列と数値変数(長整数型)を文字列連結演算子で連結してもエラーにならない。・・・なぜ? '結果は1つの文字列→strRange ="A2" '例 Range(strRange).Select '動作OK Range(strRange) = i '動作OK '------------------ '疑問2の例 strInput = InputBox("選択行を入力してください", , "4") 'strInputは文字列型変数 j = strInput '疑問2:数値変数(長整数型変数)に文字型変数を代入してもエラーにならない・・・なぜ? '結果は長整数型変数(数値) j=4 (Input BOX をデフォルトでOKしたとき) '例:以下の両方とも動作OK '1) strRange = "A" & strInput '文字列 & 文字列 →文字列 strRange ="A4";疑問なし Range(strRange).Select '動作OK Range(strRange) = strInput '2) Cells.Clear '確認用にクリアスクリーン Range("A1").Select '確認用にセル位置移動 strRange = "A" & j '文字列 & 数値 →文字列 strRange ="A4";疑問1と同じ Range(strRange).Select '動作OK Range(strRange) = j '動作OK End Sub

  • VBA教えて下さい

    for nextの使い方がわかりません 変数を使用し条件に当てはまる数値だけ 処理するといった内容です 考えたコード sub test() dim a as variant dim b as variant dim i as variant with workbooks("book1").activesheet set a =.range("A5") set b =.range("B5") end with with workbooks("book2").activesheet for i = 80 to 110 if a = cells(i,1) then b.value = cells(i,2) end if next i end sub このコードにてやりたい事は まず、book1の今開いてるシートを参照し A5セル、B5セルをセットし (例えばA5は2と入力している B5セルは10000と入力している) 次に、book2の今開いてるシートを参照し もし、1行目の80~110どれかのセルの数字が 変数aと同じ値ならば (A行80~110行のセルの数字2があれば 例えば85列) 変数bの数字を2行目の80~110に条件に当てはまるセルに移す (B行85列にB5セルの値10000を移す) ()の部分は例えで書いてます 読みにくかったら無視でお願いしますm(__)m 指定の仕方など間違ってると思うので コードを書いてくれると助かります 回答お願いしますm(__)m

  • エクセルでセルの値がTRUEかFALSEか判定

    Q3:R19の表があります。 Q列にはTRUEかFALSEが入りますが、空白や文字列の場合もあります。 R列には文字列です。 Q列でFALSEのセルだけ、同じ行のとなりのR列の文字列を順に抜き出し、メッセージボックスに表示したいのです。 下記のようなVBAを書いてみましたが、Q列が空白や文字列の場合まで抽出されてしまいます。 これを排除するいい方法はないでしょうか? Sub test01()   Dim msg As String   Dim i As Long   With Sheets("LOG")     For i = 3 To 19       If .Range("Q" & i).Value = False Then '        Debug.Print  i & "-" & .Range("R" & i).Value         msg = msg & .Range("R" & i).Value & vbCrLf       End If     Next i   End With   If msg <> "" Then     MsgBox msg & vbCrLf & "上記により不可です。", vbCritical   End If End Sub

専門家に質問してみよう