- 締切済み
値の貼り付けをするVBA
セルA1をコピーして、セルA2に値の貼り付けをするVBAを作っています。 下記のように記述しているのですが、 セルA2に値の貼り付けをするときに小数点第3ケタ目以下はデータを捨てることは出来ますでしょうか? セルの設定で小数点2桁目まで表示するのではなくて、セルに入力するデータを小数点2桁の数字にしたいです。 range("A1").Copy Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- cj_mover
- ベストアンサー率76% (292/381)
#4、cjです。 #1、#3-5、と、Excel数式とVBAを組み合わせた応用例が続いていますが、 「Excel VBA」ならではの手法、ということでは共通していますね。 蛇足ですが、#4に追記することにします。 > 今やらなければならない仕事を早く片付けたい、 > マクロは使い捨てだから早く書けて結果さえ出せればればどうでもいい、 この意味を伝えるには実際の書き方を提示しないと通じなかったですね。 #4の3例を「結果さえ出せればれば」「早く書けるものがいい」 という意図を徹底して書く場合は以下のようになります。 [b1:b30000]=application.text([a1:a30000],"#.00") [b1:b30000]=[if(a1:a30000,int(a1:a30000*100)/100)] [b1:b30000]=[index(rounddown(a1:a30000,2),)] これを使い捨てマクロに手早く記入すること、もありますが、 イミディエイトウィンドウに書き込んでそのままEnterで実行して、 ちゃっちゃと片付ける、という使い方の方が多いです。 1例目と3例目等は、特に頻繁に使うMy定番書式なので、 さらっと書いて片付ける、という感じです。 My定番書式でいうと、 H列とI列の文字列等を連結してJ列に返す配列処理 [j1:j100]=[h1:h100&i1:i100] こんな↑のも、私はよく使います。 私の回答の趣旨としては、 目的をはっきりさせて、その目的に適う方法を 自分のスタイルの内のひとつに加える、ということです。 「早く書く」「処理が速くなるように書く」 「誰にでも解るように書く」「後から書き替え易いように書く」 「後々の仕様変更に備えた書き方をしておく」とか、 色々な場合があって、その色々に応える形で書き分ければいいのだと思います。 目的から、方法を選べばいいので、 「この方法は避けたい」とか「最初に方法ありき」みたいなことには あまり囚われ過ぎないようにして欲しいな、と思っています。
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 >式が入った3万行分のデータを値の貼り付けで桁数を減らしたいのですが、 >For~Next文でやるしかないですか? For ~Nextで出来るのなら、別にスタイルにこだわる必要もないと思います。3万行であろうが、そんなに時間の掛かる話ではないし、私が、最初の掲示板デビューの時には、マクロが6時間以上掛かるけれどもという相談で、私が、それを20分程度にまで短縮したと喜ばれましたからね。今では、考えられない話です。 そんな昔の話はとかもくとして、例えば、こんなマクロで出来ますね。 ここに出ている、どの回答でも、良いとは思いますが、私は、なにか自慢げに裏ワザ的なものを書いているようですが、こんなものを、わけも分からず使うのはお勧めしません。以下が、読めるようなら、掲示板には聞かないかもしれませんが、こういうコードにどっぷりハマってしまうようだと、私個人は、何かオシマイのような気がしているのです。なぜかというと、ここには、プログラミングとしてのロジックが存在しないからです。言い換えると、Excelそのものは、世界中の人が、裏ワザ的なものを探し求めて日進月歩で、私などは敵わないと思うことが多いのですが、プログラミングの世界はロジックであって、それそのものは旧態依然で、十分な気がします。 '// Sub Test1() Dim Ar As Variant Dim Rng As Range Set Rng = Range("A1", Cells(Rows.Count, 1).End(xlUp)) Ar = Application.RoundDown(Rng, 2) Rng.Value = Application.Index(Ar, 0, 1) Set Rng = Nothing End Sub '//
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは、お邪魔します。 1行で書けなくもない、という例を紹介してみます。 四捨五入なら、 Range("B1:B30000").Value = Application.Text(Range("A1:A30000").Value, "#.00") 切り捨てなら、 Range("B1:B30000").Value = Application.Evaluate("IF(A1:A30000,INT(A1:A30000*100)/100)") とか、 Range("B1:B30000").Value = Application.Evaluate("INDEX(ROUNDDOWN(A1:A30000,2),)") とかの方法もあります。 3例とも、Excelの配列数式をVBAで応用する例です。 こういうのを見ると"裏ワザ"と蔑む人がいますけれど、 VBAに用意されている WorksheetFunction.Text メソッド Application.Evaluate メソッド 共に、こういう時にこそもてる力を発揮するもの、ではあります。 まぁでも、誰にでも理解され易いものではないという意味では、裏ワザ的ではあります。 VBAの完成度を求めるなら最適化に努めながらループするのが当然ながら一番です。 ここに挙げたのは、 今やらなければならない仕事を早く片付けたい、 マクロは使い捨てだから早く書けて結果さえ出せればればどうでもいい、 というように、目的やその優先度がはっきりした局面などでは、 役に立つ機会が多い手法だと思います。 質問への回答用にダミーサンプルを作る機会が多い私などには、 無いと困るような書式だったりもします。 本題にそった話として、 何が何でもPasteSpecialに拘るなら、 クリップボードのデータを書き換えるような手もあるにはあります。 でも、求める処理のシンプルさに比して、手間が掛かりすぎるものになってしまいますから、 目的には適わないですよね。 以上です。
- xls88
- ベストアンサー率56% (669/1189)
式を入れて値に置き換えればどうでしょうか。 (例) With Range("B1:B30000") .Formula = "=ROUNDDOWN(A1,2)" .Value = .Value End With
- kybo
- ベストアンサー率53% (349/647)
形式を選択して貼り付けで貼り付けるときに数値を切り捨てるとかの操作はできません。 以下のようなに、コピー→貼り付け以外の操作で行う必要があります。 Range("A2").Value = Int(Range("A1").Value * 100) / 100
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! コピー&ペーストではなく、単純に値を表示させてはダメですか? Range("A2") = WorksheetFunction.RoundDown(Range("A1"), 2) といった感じで・・・m(_ _)m
お礼
ありがとうございます。 やはり、値の貼り付けを使うと桁数を減らすことはできないのですね。 式が入った3万行分のデータを値の貼り付けで桁数を減らしたいのですが、 For~Next文でやるしかないですか?