プロが教える店舗&オフィスのセキュリティ対策術

Range("E1").PasteSpecial Paste:=xlPasteValues

↑これは、コピーしたセルを「値で貼り付け」する記述ですが、
「xlPasteValues」の部分を「PasteType」等の適当な変数名にして、
「xlPasteValues」だったり「xlPasteAll」に可変にすることはできますか?

VBAを学び始めたばかりなのですが、よろしくお願いいたします。

A 回答 (8件)

③の場合です。

セルA1に「xlPasteValues」または「xlPasteAll」のいずれかが格納されている場合です。(他の文字は格納されていない前提)
Dim PasteType As Long
If Range("A1").Value = "xlPasteValues" Then
PasteType = xlPasteValues
Else
PasteType = xlPasteAll
End If
Range("E1").PasteSpecial Paste:=PasteType
とします。

②の場合です。セルA1に"-4163"または"-4104"の文字が格納されている場合です。
Dim PasteType As Long
PasteType = CLng(Range("A1").Value)
Range("E1").PasteSpecial Paste:=PasteType
とします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
なるほど、
セルの値をそのまま代入する事は出来ないんですね。

お礼日時:2018/03/03 11:38

こんにちは。



Const xlPasteValues などは、組み込み定数というのですが、それを変えることは、絶対にありえないというか、組み込み定数に手を付けてはいけないと言われますが、仕組みだけは、基本的なことですから、理解しておいたほうがいいです。

そうしないと、少し応用するようになると、ユーザー定義の定数が必要になります。それを知らないと可読性がひどく低くなってしまいます。数値を引数にする書き方は、極力避けるというのが、コーディング・ルールです。それから、Custom Property やCOMアドインを利用する方法もあります。

組み込み定数自体が分かりにくいし長いという場合は、ユーザー定義の定数として、

Const 全部 As Long = &HEFF8
Const 罫線抜き As Long = &H7
Const 結合条件書式付き As Long = &HE
Const テーマ利用 As Long = &HD
Const セル幅月 As Long = &H8
Const コメント As Long = &HEFD0
Const 書式 As Long = &HEFE6
Const 数式 As Long = &HEFE5
Const 数式値書式付き As Long = &HB
Const 入力規則 As Long = &H6
Const 値のみ As Long = &HEFBD
Const 値と数値 As Long = &HC

(注意:正確になっているのか確認していません)
ただし、2byte 文字のコーディングへの利用は、極力控えるべきです。特に、フリガナのない漢字は使ってはいけないと言われます。

ユーザー定義の定数の使い方は、このようにして、標準モジュールのプロシージャー外に書いてあげます。Public キーワードを付けてもよいです。
部分的なら、Private キーワードも良いし、プロシージャ内に書いてもよいです。

利用例:
With Worksheets("Sheet1")
Set Rng = .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
End With
Rng.Copy
Worksheets("Sheet2").Range("A1").PasteSpecial 書式

組み込み定数は、予め、このようにして、xlPasteTypeのクラスになっているものだと思います。気をつけなくてはいけないのは、既存の定数を始め、プロパティやメソッドの名称の上書きは通例トラブルのもとですから、してはいけません。
時々、value や str, time などを変数などに使ってしまう人がいますが、基礎的なミスにつながります。

以上です。
    • good
    • 0
この回答へのお礼

理解しておくべき情報をご教授いただきありがとうございます。
大変参考になりました。
こういう情報も聞きたかったんです。

お礼日時:2018/03/05 11:32

自分ではまず絶対にこんなことはやりませんが、


こんなことも出来ないことはない、という例です。

Private Sub test1()
Dim colPasteType As New Collection
Dim PasteType As String

With colPasteType
.Add xlPasteAll, "xlPasteAll"
.Add xlPasteFormats, "xlPasteFormats"
.Add xlPasteValues, "xlPasteValues"
' ・・・
End With

PasteType = Range("A1")
Range("E1").PasteSpecial Paste:=colPasteType(PasteType)
End Sub
    • good
    • 0

>なるほど、


>セルの値をそのまま代入する事は出来ないんですね。
はい、最終的には、-4163とか-4104の数値に変換しないといけません。
    • good
    • 0

>実は、あるセル内に「xlPasteValues」または「xlPasteAll」のいずれかが入力されており、


>そのセルの値に応じて結果を可変したいのです。
>可能でしょうか?

可能ですが、それは、どのように格納されていますか。
①-4163または-4104の数値が格納されている。
②"-4163"または"-4104"の文字が格納されている。
③”xlPasteValues”または”xlPasteAll”の文字が格納されている。

上記の何れになりますか。それにより、対処方法も異なります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
③です!でも可能なら②の方法も知りたいです。(①は現在実現できていると思います。)

お礼日時:2018/03/03 10:09

>↓とりあえずこの宣言で、「-4163」を入れてちゃんと動作しました。


>Dim PasteType As Variant
>教えて欲しいのは、変数「PasteType」に「xlPasteValues」を代入して、
>Range("E1").PasteSpecial Paste:=PasteType でエラーが起きないためにはどうしたらよいか?なんです。

Dim PasteType As Variant
PasteType = xlPasteValues
Range("E1").PasteSpecial Paste:=PasteType
なら、OKです。

PasteType = "xlPasteValues"
Range("E1").PasteSpecial Paste:=PasteType
とすると、エラーになります。

尚、
Dim PasteType As String
PasteType = xlPasteValues
Range("E1").PasteSpecial Paste:=PasteType
とすると、
PasteTypeは文字型なので、"-4163" の文字列になります。
そもそも、Paste:=に代入できるのは数値のみですから、これはエラーになります。

Variant型は数値も文字列も柔軟に格納できるので
PasteType = xlPasteValues とすると、-4163(数値が格納される)になります。
PasteType = ”xlPasteValues” とすると、 ”xlPasteValues” という文字列が格納されます。
    • good
    • 0
この回答へのお礼

ありがとうございます!
実は、あるセル内に「xlPasteValues」または「xlPasteAll」のいずれかが入力されており、
そのセルの値に応じて結果を可変したいのです。
可能でしょうか?

お礼日時:2018/03/02 23:41

No1です



>変数の定義はAs Variant でも As Stringでもダメでした。
どのような指定方法でなさったのかわかりませんが、何か勘違いしていませんか?

Variantはともかくとして(エクセルが変換してくれるので)、最終的には数値で指定しているのですから、Stringはないでしょう。

XlPasteTypeの列挙型の定数は「定数」です。
 Const hoge As Long = 50
で設定した、変数hogeとほぼ同様です。

もしかして、定数名を文字列として変数に代入していたりしませんか?
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。

勘違いではありません。そもそも分かってないのです(汗)

見よう見まねでトライして、うまく行ったら結果オーライという感じでお恥ずかしい限りです。

↓とりあえずこの宣言で、「-4163」を入れてちゃんと動作しました。
Dim PasteType As Variant


教えて欲しいのは、変数「PasteType」に「xlPasteValues」を代入して、
Range("E1").PasteSpecial Paste:=PasteType でエラーが起きないためにはどうしたらよいか?なんです。

お礼日時:2018/03/02 18:26

こんにちは



可能です。
変数の値を、xlPasteValuesやxlPasteAllにしておけば、その内容に従って処理されます。

エクセルの定数名の代わりに、直接数値で指定しても可能です。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/a …
    • good
    • 0
この回答へのお礼

ありがとうございます。
直接数字を指定するようにしたらうまくいきました。

でも文字にした場合は、「実行時エラー'1004' Range クラスの PasteSpecial メソッドが失敗しました。」となってしまいます。
変数の定義はAs Variant でも As Stringでもダメでした。

数値対応で目的は達成しましたが、文字でもできるようにしたいです。

お礼日時:2018/03/02 17:17

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

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