• ベストアンサー

エクセルVBA ワークシート関数の使用について

エクセル2003VBA ワークシート関数の使用についての質問です よろしくお願いします。 4桁の数字を、千の位・百の位・十の位・一の位に分解する関数ですが 例えば A1に4桁の数字があり、B1に千の位を表示する場合ですが ワークシート関数の場合 B1=MOD(INT($A$1/1000),10) となりますが VBAにてそのまま使用し Range("B1").value=Application.WorksheetFunction.MOD(INT(Range("A1")/1000),10)とするとエラーになります。 エラーになる原因は、いろいろ調べたら分かったのですが この様に、一発でB1に計算結果を入れたいのですが、どうしたらよろしいでしょうか 現在は、 Range("C1").Formula = "=MOD(INT(A1/1000),10)" Range("B1").value=Range("C1").value 一旦、C1に置き換えてから行っています。 よろしくお願いします

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 確かに、他の方たちのおっしゃるように、VBA に、MOD関数はありませんね。MOD 演算子です。 Range("B1").Value = INT(Range("A1").Value/1000) Mod 10 という形には、一応はなるのですが、正数のみの扱いです。小数点を含む数字も負数も使えません。 ワークシートのMOD関数が使えないわけではないのですが、通常は、以下のような方法はつかいません。ただし、MOD関数のほうが優れている部分があります。 ワークシート関数を使う場合: Range("B1").Value = Evaluate("MOD(INT(" & Range("A1").Value & "/ 1000), 10)") --------------------------------- Sub Test3() '整数のみ Dim num As Variant num = Range("A1").Value * Sgn(Range("A1").Value) Range("B1").Value = Int(num / 1000) Mod 10 End Sub ----------------------------------- Sub Test4() '整数のみ   Dim num As Variant   Dim i As Integer   Dim j As Integer   Const K As Integer = 4 '千の位から以下      num = Range("A1").Value * Sgn(Range("A1").Value)   num = CStr(num)   j = Len(num):  n = j - K   If n < 1 Then Exit Sub   For i = 1 To j     'i+1 ...2列目     Cells(1, i + 1).Value = Mid(num, i + n, 1)   Next i End Sub --------------------------------

km8000
質問者

お礼

ご回答ありがとうございました 大変参考になりました

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#5 の修正 Sub Test4() は、エラーは出ませんから、以下のようにしたほうがよいです。 × For i =1 To j   ↓ For i = 1 To n + 1

km8000
質問者

お礼

ご回答ありがとうございました 大変参考になりました

回答No.4

No.3 です。 Sub test2() の4行目の n = 1 は不要です。 ほかのコードで書いていたのを変更したとき消し忘れました。 短いコードを書くのなら、すこし解りにくいのですが次のようになります。 Sub test3()   Dim n   For n = 1 To 4     Cells(1, n + 1).Value = Mid(Cells(1,1).Value, n, 1)   Next End Sub です。

km8000
質問者

お礼

ご回答ありがとうございました

回答No.3

まず、VBA関数、ワークシート関数、ヘルプについて。 エクセルのヘルプには2通り(正確には3通り)あって、ワークシート関数についてはエクセルのシートのヘルプを、VBA関数についてはVBAエディター(コードが書かれているところ)のヘルプを見ましょう。 シートのヘルプで MOD を検索し、MOD関数をクリックすると書式が書いてあります。   MOD(数値,除数) とありますね。  VBAヘルプで MOD を検索すると、Mod演算子 というのが出てきます。 書式は、   result = number1 Mod number2 とあります。 つまり、書式が全く違うわけです。 この様な例は他にもあります。 ただし、MOD の場合、VBA では演算子として使用できるので、わざわざ関数として使う必要はありませんので、エクセルシートのMOD関数は使えないような仕様になっています。 VBAで使用できるワークシート関数一覧、およびVBA演算子については、No.1 さまの通りです。 さて、本題ですが、VBAで 「4桁の数字を、千の位・百の位・十の位・一の位に分解する」 方法は色々考えられます。 4桁用のサンプルです。 あなたの式、  Range("B1").value=Application.WorksheetFunction.MOD(INT(Range("A1")/1000),10) を生かし 100 の位の数値を出すのなら、  Range("B1").value=Int(Range("A1").Value / 100) Mod 10 となります。 なお、 Application.WorksheetFunction の Application. は通常、省略可能です。 簡単だと思えるのは、数字を一旦文字列にして1つずつ取り出し数値に変換し直す方法です。 一見難しそうですが、VBAには 数値→文字列、文字列→数値 の各変換は、エクセルが自動でやってくれます。 これを利用します。 For … Next 文を使ったり、R1C1参照形式を使用したりで、式がより簡単になったり、汎用性のあるコードになったりと、いろいろバリーエーションが出来ます。 サンプル。 Sub test()   Dim a As Integer   a = Range("A1").Value   Range("B1").Value = Mid(a, 1, 1)   Range("C1").Value = Mid(a, 2, 1)   Range("D1").Value = Mid(a, 3, 1)   Range("E1").Value = Mid(a, 4, 1) End Sub 上記コードを R1C1参照形式を使用した場合 Sub test2()   Dim a As Integer, c As Integer, n As Integer   a = Cells(1,1).Value   n = 1   For n = 1 To 4     c = n + 1     Cells(1, c).Value = Mid(a, n, 1)   Next End Sub これで、"A1"の4桁の数値(数列)が各位別に、"B1"~"E1"に入ります。  そのうち勉強してください。

km8000
質問者

お礼

ご回答ありがとうございました

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.2

Range("B1") = Mid(Range("A1"), 1, 1) こんな感じでいかがでしょうか。

km8000
質問者

お礼

ご回答ありがとうございました

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

MODワークシート関数はVBAでは使えないようです。 VBAで使用できるワークシート関数一覧 http://www.relief.jp/itnote/archives/001974.php VBAでは演算子になります。 演算子 http://www.officepro.jp/excelvba/basic/index6.html

km8000
質問者

お礼

ご回答ありがとうございました

関連するQ&A

  • エクセル2003の関数について

    =ROUND((A1*B1)*10^(3-INT(LOG(ABS((A1*B1)))))-(MOD((MOD((A1*B1)*10^(3-INT(LOG(ABS((A1*B1))))),100)-5),20)=0),-1)/10^(3-INT(LOG(ABS((A1*B1))))) という数式で有効数字3桁に丸め、尚且つ4桁目が 「5」の場合3桁目が偶数の場合に切り捨て、奇数の場合には切り上げするようにしました (例:123.5→124、122.5→122、122.51→123、1.235→1.24) A1もしくはB1に数字が入っていない場合、「#NUM!」と出ます。 このエラーを表示しない関数(ISERROR)を上記に組み込みたいのですが、うまく組み込みができません。 希望は関数を使用したエラーの非表示ですが、他にナイスな方法があれば教えて下さい。 宜しくお願い致します。

  • VBA ワークシート関数のエラー

    シートに数式を入れていたものを、VBAで値のみ入力しようと考えています。 そこで、.Cells(1,1) = WorksheetFunction.数式といった形のメソッドを試しています。 しかし、複雑な数式を記述するとエラーが出てしまいます。 成功 (iferrorというワークシート関数が1つ) Debug.Print WorksheetFunction.IfError(1 / .Cells(1, 5) + 1 / .Cells(1, 6) + 1 / .Cells(1, 7) - 1, "P") 失敗(ワークシート関数のifとcountifなど複数のものが数式に混入) Debug.Print WorksheetFunction.If(CountIf(Range("C17:D49"), Range("C29")) > 5, Range("C29"), Range("D29")) Countifの場所でエラーになります。このcountifを使えるようにするためには、どうすればよいのでしょうか? WorksheetFunction.if(WorksheetFunction.Countif(、、、、という書き方はダメでした。 数式が汚くてすみません。 宜しくお願いいたします。

  • EXCEL 2010 VBAまたは関数について

    こんにちは 初投稿です。 早速ですが、VBAまたは関数について質問させて頂きたいのですが・・・ 一つのセルに複数の数字と文字列がセルのE1混ざっている場合, (12345abc678cdef9ghijk)と入っている場合 にこの例で行くとセルのA1に12345セルB1に678セルC1に9というように数字で表示させたいのです が、最初関数で A1=VALUE(MID(E1,1,5)) B1=VALUE(MID(E1,9,3)) C1=VALUE(MID(E1,16,1)) と言う形で数字だけ抜き出していたのですが これだと数字の桁数が違ってくる(※正し文字列の長さは一緒 数字だけが桁が違ってきます) と表示されなくなってしまうため、 出来れば関数をいじらなくても表示されるようにしたいのです。 VBAもしくは関数でこの問題を解決出来る方がいらっしゃるなら どうぞよろしくお願い致します。 長文失礼致しました。 | A | B | C | D | E | ------------------------------------------------ 1 | 12345 | 678 | 9 | | 12345abc678cdef9ghijk | 2 | | | | | |

  • エクセルVBAで日付を・・・

     VBAの初心者なんですけど、ワークシート関数のtoday()と同じ働きを持つVBAってありませんか?  ただ、例えば、 Range("A1").value="=today()" 以外のものでお願いします。

  • エクセルvbaのワークシート関数について

    テキストなどでvbaのワークシート関数を使うとき下の二つのコード のようにつかいなさい、と書かれていますが、両方同じように使って いいのでしょうか?実行結果は、ちがいますが。 Range("E3:E6").FormulaLocal = "=SUM(C3:D3)" Range("C6:D6").FormulaLocal = "=SUM(C3:C5)" 商品 上半期 下半期 合計 りんご 30 65 95 みかん 10 68 78 バナナ 30 65 95 合計 70 198 268 Range("E3:E6").FormulaLocal = WorksheetFunction.Sum(Range("C3:D3")) Range("C6:D6").FormulaLocal = WorksheetFunction.Sum(Range("C3:c5")) 商品 上半期 下半期 合計 りんご 30 65 95 みかん 10 68 95 バナナ 30 65 95 合計     70 70 95

  • 《Excel2007》INT関数について

    あるセルに入っている数字(表示形式は通貨)から1桁ずつ 別のセルに移したく雛型を作っています。 《例》A1=12.34を、C1=1 D1=2 E1=3 F1=4、と言う風に入れたく、 F1=INT(MOD(SIGN($A$1)*$A$1/0.01,10)) E1=INT(MOD(SIGN($A$1)*$A$1/0.1,10)) D1=INT(MOD(SIGN($A$1)*$A$1/1,10)) C1=INT(MOD(SIGN($A$1)*$A$1/10,10)) B1=INT(MOD(SIGN($A$1)*$A$1/100,10)) ↑B1はこの例では必要ないですが、A1の数字が増えたときのため。 と、入れているのですが、 (1)ない位に0が入ってしまうのを回避できますか? (この場合、10の位までしかないのに、100の位=B1に0が返される) (2)一番右の桁の数字がたまにずれるのですが理由が分かりません… 勉強不足ですみません。よろしくお願い致します。

  • VBAの関数について

    VBA初心者です。 VLOOKUP関数の使い方がわかりません。 具体的に書かせてもらうと VBAの中にVLOOKUP関数を使いたいです 試験1ファイルのシート"sheet1"にある 検索値を使い 試験2ファイルの指定した検索範囲を 試験1ファイルのシート"sheet1"の指定した位置に数値を挿入することです。 例えばですが(この使い方も間違ってるかもしれません)コードを書いてみると 試験1の検索値はA5セルとします 試験2の検索範囲はB1~C20とします 検索範囲から取得した数値の位置はD5とします VLOOKUPに関してですが 検索値は変数を使い 検索値範囲も変数を使い 列番号はC列がいいので3で 検索方法はFALSEでお願いします sub test() dim a as range dim b as workbooks dim c as range set a = range("B1~C20") set b = workbooks("sheet1") set c = range("A5") workbooks("試験1").worksheets("sheet1").range("D5").value=workbooks("試験2").activesheet."=VLOOKUP(ここがわかりません)".value end sub そもそも変数やsetの使い方が間違ってるかもしれませんm(__)m コードを書いて貰えるととても助かります。 回答お願いします。

  • 1行おきのデーターを他のシートに詰めて表示する。

    1行おきのデーターを他のシートに詰めて表示する。 よろしくおねがいします。 1行おきの(シート【A】)のデーターを、他の(シート【B】)に詰めて表示する。 EXCEL関数で Range("C5").Value =【A】!B5 Range("C6").Value =【A】!B7 Range("C7").Value =【A】!B9 Range("C8").Value =【A】!B11  ~ これをVBAで実施できないでしょうか。

  • エクセルVBAの掛け算

    お世話になります。 VBA初心者です。 セルA1にはB1×C1の答え Range("A1").Value = Range("B1") * Range("C1") これを、B1が空白ならA1も空白に、そうでないならA1にB1×C1の答えを入れたいのですが 分かりません。 Range("A1").Value = "IF(B1="""","""",B1 * C1)"これだと A1に『 =IF(****** 』と関数が入ってしまいます。 どなたか 分かる方教えて下さい。 宜しくお願いします。

  • EXCELのワークシート関数をVBAに書き直す。

    お世話になります。 Excel2013において、以下のワークシート関数の処理をVBAに書き直すにはどうしたら良いでしょう? =IF(ISBLANK($C4),"",IF(COUNTIF($C$4:$C4,$C4)>1,"重複しています。",INDEX(顧客!$A:$M,1,SUMPRODUCT(((顧客!$A:$M=$C4)*COLUMN((顧客!$A:$M)))))))

専門家に質問してみよう