• 締切済み

値の貼り付けをするVBA

セルA1をコピーして、セルA2に値の貼り付けをするVBAを作っています。 下記のように記述しているのですが、 セルA2に値の貼り付けをするときに小数点第3ケタ目以下はデータを捨てることは出来ますでしょうか? セルの設定で小数点2桁目まで表示するのではなくて、セルに入力するデータを小数点2桁の数字にしたいです。 range("A1").Copy Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

#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] こんな↑のも、私はよく使います。 私の回答の趣旨としては、 目的をはっきりさせて、その目的に適う方法を 自分のスタイルの内のひとつに加える、ということです。 「早く書く」「処理が速くなるように書く」 「誰にでも解るように書く」「後から書き替え易いように書く」 「後々の仕様変更に備えた書き方をしておく」とか、 色々な場合があって、その色々に応える形で書き分ければいいのだと思います。 目的から、方法を選べばいいので、 「この方法は避けたい」とか「最初に方法ありき」みたいなことには あまり囚われ過ぎないようにして欲しいな、と思っています。

回答No.5

こんにちは。 >式が入った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)
回答No.4

こんにちは、お邪魔します。 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)
回答No.3

式を入れて値に置き換えればどうでしょうか。 (例) With Range("B1:B30000") .Formula = "=ROUNDDOWN(A1,2)" .Value = .Value End With

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

形式を選択して貼り付けで貼り付けるときに数値を切り捨てるとかの操作はできません。 以下のようなに、コピー→貼り付け以外の操作で行う必要があります。 Range("A2").Value = Int(Range("A1").Value * 100) / 100

miya2004
質問者

お礼

ありがとうございます。 やはり、値の貼り付けを使うと桁数を減らすことはできないのですね。 式が入った3万行分のデータを値の貼り付けで桁数を減らしたいのですが、 For~Next文でやるしかないですか?

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! コピー&ペーストではなく、単純に値を表示させてはダメですか? Range("A2") = WorksheetFunction.RoundDown(Range("A1"), 2) といった感じで・・・m(_ _)m

関連するQ&A

  • エクセルVBAで値の貼り付けができない

    色々調べたのですが、出来ない理由が見つけられません。よろしくお願い致します。 計算式の入っているセルをマクロで貼り付けしようと思っているのですが、 貼り付ける際、値の貼り付けにしたいのです。 下記の通りすると計算式のまま貼り付けされてしまいます。 どなたか教えて下さい。お願い致します。 Selection.Copy wsKei.Select wsKei.Range("A" & intLinekeistr & ":A" & intLinekei - 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False エクセルは、2007 PCはvistaです。

  • VBA セルの値を別セルにコピーするには

    VBAでPastespecialでセルの値を別セルにコピーするマクロを組みたいです。 以下は参考にしたソースコードです。 Worksheets("Sheet1").Range("A1:B10").Copy Worksheets("Sheet2").Range("A1").PasteSpecial _                  Paste:=xlPasteValues, _                  Operation:=xlNone, _                  SkipBlanks:=False, _                  Transpose:=False あるExcelマクロの入力フォームSheetに、製品リストと使用している場所のマスタデータをクエリで読み込んで、製品IDと場所のコードを入力したらINDEX関数で抽出し、マクロ実行ボタンを押すと抽出結果を入力フォームの入力欄に貼り付けします。 上記のマクロだと貼り付けする元セルを移動させたら内容がずれた値がそのまま貼り付けされてしまうと思われますが、地道にコードのコピー元のセルを書き直さないといけないのでしょうか。 Excelの関数だと参照範囲を固定したら掴んで移動させてもセル番地が連動して移動してくれますが、マクロの場合どのようにすれば良いでしょうか。 また、複数個所のセルをコピーするので Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False をコピーするセルの箇所に毎回入れていますが、コピー元のセル・コピー先のセル番地を一括して実行する方法はありますでしょうか。 VBAはソースコードを参考に当てはめているだけで、自力でコードを書くスキルは皆無です。 Excelは2016です。 詳しい方いましたらご教授ください。よろしくお願い致します。

  • 形式を選択して貼り付け

    Range("a" + z + 1).PasteSpecial_ Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=True 上記を入力し、実行すると「この操作には同じサイズの結合が必要です」とエラーが出ます。本を見て同じように作成したので、何処が間違ってるのか、分かりません。教えて下さい。

  • シート1のC列の最終行をコピーして同じ行に値貼り付けしたい

    シート1のC列の最終行を取得して その行を丸々値貼り付けするマクロを作りたいと思います。 シート3のB18の値をシート1のC列の最終行の1つ下のセルに値貼り付け すると、その行のA、B列に日付が入力される関数が入っています。(下まで) 関数が入ったままだと、うまくいかない時があるので最終行をコピーして値貼り付けしたいのですが、マクロの作り方を教えてください。 シート1の最終行に貼り付け Sheets("Sheet3").Select Range("B18").Select Selection.Copy Sheets("Sheet1").Select Range("C65536").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 最終行をコピーして値貼り付け Dim 最終行 As Integer 最終行 = Range("C65536").End(xlUp).Row Range("A6:C" & 最終行).Select Selection.Copy Sheets("Sheet1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub このマクロだと、A6からC列の最終行まで全てコピーされてしまうので、C列の最終行のAからC列まで1行だけコピーできないでしょうか?

  • 値の貼り付けマクロが出来なくなりました。

    http://kokodane.com/macro17.htm 頻繁に、形式を選択して貼り付けで「値の貼り付け」を行うため、 上記のサイトを参考にしてマクロを作成しました。 コードは Sub 値の貼り付け() ' Keyboard Shortcut: Ctrl+t '   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _     SkipBlanks :=False, Transpose:=False End Sub です。 それが昨日のことなのですが、そのときはうまくマクロが動作して、 データを貼り付けることが出来ていたのですが、 今日やってみるとなぜかうまくいきません。 特に何か設定は変えていません。 セキュリティは下げた状態にしてあり、他のマクロは通常通り使えています。 コピーペーストは普通に行えています。 なぜなんでしょうか? 何度かマクロを作成しなおしてみたりもしたのですが、 どうやってもうまくいきません。 どなたか理由を教えて下さい。

  • エクセルVBAで値のカウントをしたい

    C列~AA列まで値が入っています 1行目にはタイトル 2行目からそれぞれ値が入っており、終了行は毎回ランダムです 各列毎に値の合計と1以上の値の合計数を表示するために下記のマクロを使用しているのですが、もっとスマートな方法は無いでしょうか? 現在のマクロだとマクロ行数がとても多いものになっています。 Sub Count() With Range("C2") .End(xlDown).Offset(1, 0) = _ "=SUM(" & Range(.Address, .End(xlDown)).Address(False, False) & ")" End With '本当はCの最終行に直接COUNTIFを書き込みたいが、他のセルを使用しないと0になる Range("A1") = "=COUNTIF(C2:C10000,"">=1"")" Range("A1").Select Selection.Copy Range("C1").End(xlDown).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CommandBars("Stop Recording").Visible = False With Range("D2") .End(xlDown).Offset(1, 0) = _ "=SUM(" & Range(.Address, .End(xlDown)).Address(False, False) & ")" End With Range("A1") = "=COUNTIF(D2:D10000,"">=1"")" Range("A1").Select Selection.Copy Range("D1").End(xlDown).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CommandBars("Stop Recording").Visible = False '以降AAまでセルの位置を変えた同一マクロを繰り返す End Sub

  • 指定セルをコピー

    A2~A5,D2~D5,G2~G5をコピーしJ~P列2~5行に値を貼付け続いて9~13行、16~20行もJ~P列に貼り付けたいのですが7~8,14~15行にはセル結合されているところもあります。VBAで下記コードを入力しましたがあまりにデータが多く何か良い方法VBAコードはありますか。(For~Nextなど使用すれば良いのでしょうか) 環境はoffice2013です。 Range("A2:A6").Select Selection.Copy Range("J2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("D2:D6").Select Selection.Copy Range("M2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False  Application.CutCopyMode = False

  • エクセルのマクロ 選択したセルを指定した範囲へ値貼

    お世話になります。 自動記録したものをどのように修正したら、実行時に選択しているセルの値を、3行下、1つ左のセルから8行目までに貼り付けることができるよう書き変えられますでしょうか。 初心者で何に手を付けて良いのか分からず。どなたかご教示いただけませんでしょうか。どうぞよろしくお願い致します。 Sub 選択したセルを指定した範囲へ値貼り付け() ' ' Macro1 Macro ' ' Range("I9").Select Selection.Copy Range("H12:H19").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

  • エクセル コピー ペースト 形式 すべて  マクロ

    エクセルの同じシート内で、セルをコピーし、他のセルにペーストするマクロを利用しております。 Worksheets("data").Range("A45").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False しかし、このマクロでは、ペーストする際に、「形式を選択して貼り付け」の「値」のみが貼り付けられてしまいます。 数式を残した状態でペーストしたいので、「すべて」の状態で貼り付け希望です。 なお、このシートは表示しない状態で使用するため、シートを選んでセルを選択してコピーする方法はできません。(マクロでエラーとなってしまいます。) どうか、よろしくお願いします。

  • Excel 2007 マクロ 表の貼り付け

    Excel 2007 マクロ 表の貼り付け Excel 2007 マクロ 表の貼り付けについて教えてください。 <Sheet1>の表にあるA2からD4を <Sheet2>に値貼り付けをします。 表は画像を添付します。 マクロの記録では下記内容になります。 Sub Macro1() ' ' Macro1 Macro ' ' Range("A2:D4").Select Selection.Copy Sheets("Sheet2").Select Range("A2:D4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub <Sheet1>のA列の行の増減にかかわらず、<Sheet2>に貼り付けることができるように するにはどのようにマクロを修正すればよろしいでしょうか。

専門家に質問してみよう