プロが教えるわが家の防犯対策術!

こんばんは。
エクセルのセルで数字とアルファベットの文字列を分割する方法を教えて下さい。

100AB3.4C → "100" "AB" "3.4" "C"

間にスペースやカンマなど無く、文字数は異なります。
数字は小数点がある場合と無い場合があります。(上記の "100" "3.4" のように)
同じ列に同様のデータが数件~数千件あり、まとめて分割したいです。

関数もしくはマクロ(VBA)で可能であれば教えて下さい。

最近マクロの勉強を初めたのですが、方法が思いつきません。。。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

#2=#3です。



●ユーザー定義関数版

動作の概要
 第1引数で指定した文字列を、数字と文字に分割し、
 第2引数で指定した番号の文字列を返す
 ex. =Sample2("100AB3.4C",3) ⇒ "3.4"

 A列の文字列についてB,C,D…列に返すのであれば、
 B1セル:=Sample2($A1,COLUMN()-1)
 として右方・下方にフィル

'----------------↓ ココカラ ↓----------------
Function Sample2(myStr, myIdx)
 Dim a() As String
 f = IsNumeric(Left(myStr, 1))
 j = 1
 ReDim a(j)
 For i = 1 To Len(myStr)
  t = Mid(myStr, i, 1)
  If (f <> IsNumeric(t)) And Not (f And t = ".") Then
   f = Not f
   j = j + 1
   ReDim Preserve a(j)
  End If
  a(j) = a(j) & t
 Next i
 If myIdx <= j Then
  Sample2 = a(myIdx)
 Else
  Sample2 = ""
 End If
End Function
'----------------↑ ココマデ ↑----------------

●Subプロシージャ版

動作の概要
 A列1行目以降の文字列を、
 数字と文字に分割し、B列以降に転記する

'----------------↓ ココカラ ↓----------------
Sub Sample3()
 
 d = "A1" '元データの最初のセル
 r = "B1" '結果表示範囲の最初のセル
 
 Dim a() As String
 For k = Range(d).Row To Cells(65536, Range(d).Column).End(xlUp).Row
  ReDim a(1 To 1)
  myStr = Cells(k, Range(d).Column)
  f = IsNumeric(Left(myStr, 1))
  j = 1
  ReDim a(1 To j)
  For i = 1 To Len(myStr)
   t = Mid(myStr, i, 1)
   If (f <> IsNumeric(t)) And Not (f And t = ".") Then
    f = Not f
    j = j + 1
    ReDim Preserve a(1 To j)
   End If
   a(j) = a(j) & t
  Next i
  Cells(k, Range(r).Column).Resize(1, j) = a()
 Next k
End Sub
'----------------↑ ココマデ ↑----------------

いずれもExcel2003で動作確認済。
ただし、最低限の記述しかしていないので、
コーディングは参考にしない方がよろしいかと。

不明な点も多いと思いますし、
ご要望に沿わない点もあるかもしれませんが、
これ以上は完全に作業になってしまいますから、
最終回答ということにさせてください。

■Excelでお仕事!「VBA基本」メニュー
http://www.asahi-net.or.jp/~ef2o-inue/menu/menu0 …
    • good
    • 1
この回答へのお礼

回答本当に有難うございます。
上手く出来ました。
サイトも教えて頂き有難うございます。
サイトは印刷して通勤途中に読んでます。
他にも色々やりたい事があるので、勉強がんばりたいと思います。

お礼日時:2008/02/19 22:32

NO1さんも書かれているのですが、「ツール」→「参照設定」で


「Microsoft VBScript Regular Expressions 5.5」チェックしてください。

参考URL:http://codezine.jp/a/article/aid/1655.aspx
    • good
    • 0
この回答へのお礼

回答有難うございます。
正規表現、出来ました ^^
それで教えて頂いた内容でエラーにはならないのですが
上手く実行出来ませんでした。。。
例えば問題の内容"100AB3.4C"をA1セルに入力して、B1セルから分割内容が表示されるようにしたいのですが。
度々申し訳ございません。
もし良かったらもう少し教えて頂けると嬉しいです。

お礼日時:2008/02/13 23:45

No1さんと同じく正規表現ですが


Sub test()
Dim s As String
s = "100AB3.4C99"

Dim re As New RegExp
Dim mc As MatchCollection
Dim m As Match
Dim i As Long, j As Long
Dim t As String
re.Global = True
re.Pattern = "([0-9.]*)([^0-9.]*)"
Set mc = re.Execute(s)
If mc.Count <> 0 Then
For i = 0 To mc.Count - 1
Set m = mc.Item(i)
For j = 0 To m.SubMatches.Count - 1
If m.SubMatches(j) <> "" Then
t = t & """" & m.SubMatches(j) & ""","
End If
Next
Next
t = Mid(t, 1, Len(t) - 1)
End If
Debug.Print t
End Sub
    • good
    • 0
この回答へのお礼

回答有難うございます。
VBAと正規表現とは違うのでしょうか?
エクセルのマクロに教えて頂いた内容を入力してみたのですが、エラーになってしまいました。
ちょっと調べてみたら、エクセルでは正規表現が使えないみたいな内容があったのですが…何か必要なのでしょうか??
最近マクロの本を読みながら、ちょっと出来るようになって喜んでいるのですが、まだまだ全然ダメですね。。。
奥が深いです。

お礼日時:2008/02/12 22:06

#2です。


>教えて頂いた B1:="" が上手く出来ませんでした。。。
>数式を変えてみたらエラーになってしまって。
表現が紛らわしかったですね。すみません。
C列の数式自体ははそのまま変えません。
----------------------------------------------------
●元データが必ず数字から始まる場合

元のデータがA列1行目以下に入っているとします。
1.B1セルに下記の数式を入力
 =""
2.B1セルを下方にフィル
3.C1セルに下記の数式を入力(#2とまったく同じ式)
 =MID($A1,SUMPRODUCT(LEN($B1:B1))+1,MATCH(ISNUMBER(--B1),INDEX(ISNUMBER(--MID($A1&B1,SUMPRODUCT(LEN($B1:B1))+IF(ISNUMBER(--B1),INDEX(ROW($1:$20),),1),IF(ISNUMBER(--B1),1,INDEX(ROW($1:$20),)))),),0)-1)
4.C1セルを右方・下方にフィル
----------------------------------------------------
なお、B列ですが、
どちらにしろ見た目は空白なので、一見無駄っぽく思われますが、
計算に必要なので省けません、念のため。

この回答への補足

同時に投稿した別の質問でお答え頂いた件、出来ました^^
そちらは締め切ってしまったので、こちらでお礼させて下さい。
Functionってスゴイですね。
こんなことも出来るなんて…奥が深いです。
今回質問した事によって勉強意欲がかなり沸いてきました。
有難うございました。

補足日時:2008/02/13 23:45
    • good
    • 0
この回答へのお礼

ご丁寧に教えて頂き有難うございます。
出来ました (^0^)/
B列は別に品種を入力する必要があるので、ちょうど良い感じです。
今日、会社で上手く出来てニヤけてしまいました。
もうひとつお願いしてもいいでしょうか。
教えて頂いた数式をエクセルにコピーして使っていたので、
出来たらマクロに記録したいと思ってやってみたのですが、エラーになってしまいます。。。
もしよろしければ、VBAに入力する数式を教えて頂けませんでしょうか?

お礼日時:2008/02/12 21:49

>関数もしくはマクロ(VBA)で


ということなので、参考までに数式による解決を。

元のデータがA列1行目以下に入っているとします。

1.B列は何も入力しない
2.C1セルに下記の数式を入力

 =MID($A1,SUMPRODUCT(LEN($B1:B1))+1,MATCH(ISNUMBER(--B1),INDEX(ISNUMBER(--MID($A1&B1,SUMPRODUCT(LEN($B1:B1))+IF(ISNUMBER(--B1),INDEX(ROW($1:$20),),1),IF(ISNUMBER(--B1),1,INDEX(ROW($1:$20),)))),),0)-1)

3.C1セルを右方・下方にフィル

元のデータが文字から始まる場合はC列から分割して表示されます。
元のデータが数字から始まる場合はD列から分割して表示されます。

元のデータが必ず数字から始まるのであれば、
B1:="" として下方にフィルすれば、C列から表示されます。

分割後の個々の数値・文字列が20文字を超える可能性がある場合には、
$20の部分を適当に増やしてください。
分割後の個々の数値・文字列が20文字より明らかに短い場合には、
$20の部分を適当に減らせば少し軽くなります。

Excel2003で動作確認済。
    • good
    • 0
この回答へのお礼

回答有難うございます。
出来ました!!感動しました!!
明日、早速仕事で使ってみたいと思います。
今から明日の仕事が楽しみです^^
でもこの数式、スゴイですね。
この数ヶ月、自分なりに考えてみて全然出来なかったのが納得です。

ちなみに、元データは必ず数字から始まるのですが
教えて頂いた B1:="" が上手く出来ませんでした。。。
数式を変えてみたらエラーになってしまって。
もしよろしければ、これも数式で教えて頂けると嬉しいです。

お礼日時:2008/02/07 23:18

1回で変換する方法もあると思いますが、正規表現に詳しくないので2回で行っています。


参照設定でMicrosoft VBScript Regular Expressionsを設定してください。

Sub test()
Dim s As String
s = "100AB3.4C"

Dim re As New RegExp
re.Global = True
re.Pattern = "([0-9.])([^0-9.])"
s = re.Replace(s, "$1"" ""$2")
re.Pattern = "([^0-9.])([0-9.])"
s = re.Replace(s, "$1"" ""$2")
s = """" & s & """"
Set re = Nothing

MsgBox s
End Sub
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
教えて頂いた内容をVisual Basic Editorに入力してみたのですが、エラーになってしまいました。
Microsoft VBScript Regular Expressionsとは別物なのでしょうか?
それとも入力に間違いがあるのでしょうか?
そのままコピーして貼り付けてみたのですが。。。
ネットで調べてみたのですが良く分からなくて
プログラム以前の質問でスミマセン。

お礼日時:2008/02/07 23:02

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数値とアルファベットに分ける(エクセル)

例えばA列に
ABCD1234
KJD234
LO2335
FDRTY3523
上記のように品番が入力されていたとします
これをアルファベットをB列に数値をC列に
分ける簡単な方法はありませんか?
やはり、関数しかないでしょうか?

Aベストアンサー

こんにちは。KenKen_SP です。

A1 からデータが始まるとして、

B1 の数式:(アルファベット部)
=LEFT(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},ASC(A1)&1234567890))-1)

C1 の数式:(数字部)
=RIGHT(A1,LEN(A1)-LEN(B1))

とし、B1:C1 を選択して、データ終端までフィルでコピーです。
関数のままが嫌なら、最後にコピー&形式を選択して貼り付け で値にすれば
良いと思います。

QExcelの1つのセルに入力されたアルファベットと数字を分けるには?

Excelの1つのセルに「CHSK200510-3」
というような文字が入っていたとします。
それを、「CHSK」と「200510-3」のセルに分けることは出来ますでしょうか?
ただし、「CHSK」の部分は毎回4文字ではなく、5文字や6文字、7文字の
アルファベットの場合もありイレギュラーなのです。。。
文字の個数が決まっていれば文字列関数で出来たと思うのですが、
取り出す文字数が決まっていない場合はどうすればよいでしょうか?
どうぞよろしくお願い致します。

Aベストアンサー

A1に文字列が入っています。B1に=LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},(a1)&1234567890))-1)
C1に =RIGHT(A1,LEN(A1)-LEN(B1))と入力
後は、下にドラッグして下さい。

QVBAにてデータが数字か文字かを判定するには

VBAにてデータが数字か文字かを判定するには、
どうすれば良いのでしょうか?

文字数は任意で決まっていません。


123 ← 数字
あい ← 文字
1F  ← 文字
G  ← 文字

Aベストアンサー

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Then
  MsgBox "文字列"
 Else
  MsgBox "その他" '代表的なものはエラー値です
 End If
End Sub

-----------------------------------------
こちらの場合は、全角数字も、数字として扱われます。

Sub Test2()
 If IsNumeric(Range("A1").Value) Then
   MsgBox "数字"
 Else
   MsgBox "数字ではない"
 End If
End Sub

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Th...続きを読む

Q文字列から英数字のみを抽出する関数

文字列から英数字のみを抽出する関数を教えていただきたいです。

セルの文字列にはひらがな、カタカナ、数字、アルファベット、記号等を含みます。

色々調べてはみたのですが、数字のみを抽出する関数の説明はたくさんありますが、
アルファベットも含むとなると見つかりませんでした。

数字0~9とアルファベット27個の計37個の文字なので、どうにか関数でできると思うのですが。

具体的には下記のようにしたいのです。

●A列
今日iPhone5をauで購入
最新のNEWSを15時~PCで見る 
Moonshotを生み出す「Google X」

●B列にこう表示したいのです。
iPhone5au
NEWS15PC
MoonshotGoogleX


スペースは残ったままでも結構です。

詳しい方、どうかよろしくお願いいたします。

Aベストアンサー

>数字のみを抽出する関数の説明はたくさんありますが

文字列の中に数字が「一塊だけ」ある場合の説明は多分沢山ありますが、(今回のご質問のように)「文字数字文字数字文字数字」と不定数入り混じってる場合の数式は、全く見つからなかったと思いますよ。

たとえば「英数字が最大限3カタマリまで」といった制約を付けて無理矢理関数をくっつける事は出来なくはありませんが、正直不細工ですし、そもそもあんまり現実的じゃありません。



手順:
ALT+F11を押す
現れた画面で挿入メニューから標準モジュールを挿入する
現れたシートに下記をコピー貼り付ける

public function myf(a) as string
 dim i as long
 for i = 1 to len(a)
 if mid(a,i,1) like "[0-9a-zA-Z ]" then
  myf = myf & mid(a,i,1)
 end if
 next i
end function

ファイルメニューから終了してエクセルに戻る

任意のセルに元の言葉を記入し、
=myf(A1)
のように計算する。

>数字のみを抽出する関数の説明はたくさんありますが

文字列の中に数字が「一塊だけ」ある場合の説明は多分沢山ありますが、(今回のご質問のように)「文字数字文字数字文字数字」と不定数入り混じってる場合の数式は、全く見つからなかったと思いますよ。

たとえば「英数字が最大限3カタマリまで」といった制約を付けて無理矢理関数をくっつける事は出来なくはありませんが、正直不細工ですし、そもそもあんまり現実的じゃありません。



手順:
ALT+F11を押す
現れた画面で挿入メニューから標準モ...続きを読む

Qエクセル 同一セル内の数値と文字を分ける関数

セルA1:12カローラ



セルB1:12 C1:カローラ

にしたいのですが可能でしょうか?

よろしくお願い申し上げます。
 

Aベストアンサー

数字の桁とかは規則性はありますか?

規則性があって必ず先頭から二桁が数字なら、
=LEFT(A1,2)
で数字を抜き出し、続いて
=MID(A8,3,LEN(A8)-2)
で文字を抜き取ります。

もしも数字の桁数に規則性がないなら、もう一度
内容を補足して下さい。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QExcel セル内の文字と数字をわけるには??

一つのセルの中に、文字と数字が入っているのですが、
それを別々のセルに分けたいのです。。。

例)
後楽1-1-1 → 後楽 と 1-1-1
西新宿2-2 → 西新宿 と 2-2

どなたか良い方法をご存知でしたら、教えて下さい~!!

Aベストアンサー

↓こちらの26番「数字で始まる部分から区分」を参考にしてください。

参考URL:http://www2.odn.ne.jp/excel/waza/function.html

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング