アプリ版:「スタンプのみでお礼する」機能のリリースについて

vba 数値のみコピー

sub test()
Intersect(ActiveCell.EntireColumn,Range(“3:1000”)).copy Destination:=Columns(ActiveCell.Column + 1)

今アクティブなセルの列の3〜1000行目までを1つ右の列にコピーするのですが、数値のみコピーしたいです。上に記載したコードだと罫線などもコピーされてしまいます、どーしたら良いのですか?

A 回答 (4件)

#1です


失礼、何かの続きだったのかな?
だからIntersect使っているのかな? #1の内容を訂正します。

Destination:=Columns(ActiveCell.Column + 1)
しっかり確認していません出した。1行目から出力してよいのでしょうか?
>1つ右の列にコピーする で思い込んでしまいました。

Columns(ActiveCell.Column + 1)をそのまま使用するなら、
代入式はあまり良くないかな(処理時間がかかるかも)

なので、値のみをコピペ #1のものに付け加え(セルが移動しないように)(変数に入れてみました)

Dim acCell As Range
Set acCell = ActiveCell
Application.ScreenUpdating = False
Intersect(ActiveCell.EntireColumn, Range("3:1000")).Copy
Cells(1, ActiveCell.Column+1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
acCell.Select
Application.ScreenUpdating = True


代入式を使う場合は、範囲を指定した方が良いと思います。
代入式の場合、範囲を変えず位置を変えるイメージ

Dim myRng As Range
Set myRng = Intersect(ActiveCell.EntireColumn, Range("3:1000"))
myRng.Offset(1 - myRng.Row(), 1).Value = myRng.Value

#1と合わせてご確認ください。
    • good
    • 1
この回答へのお礼

助かりました

ありがとうございます!!!
Qさん、今の僕にはレベルが高すぎる回答でまるで異次元です。
ちなみにIntersectは意味をしらず独学で辿り付きました、素人すぎまして、きっと使っている言葉の本来の意味を理解していないけど、とりあえず形になっていれば、、、っという感じで書いているのだと自分自身で思います。
今後もご指導いただけると幸いです。

お礼日時:2021/03/05 17:47

#1#3です。


大丈夫です。自身で調べて検証すれば、すぐに理解されると思いますよ。
「だからIntersect使っているのかな」あまり見ない使い方でしたので。
>Intersectは意味をしらず 
文字通り交差するを意味していると思います。
参考サイト
http://officetanaka.net/excel/vba/tips/tips118.htm

Intersect(ActiveCell.EntireColumn,Range(“3:1000”))は、
アクティブなセルのある列の全行と3行から1000行の全列の範囲の
交わるセル範囲となります。

A列にアクティブセルがある場合、A3:A1000のセル範囲です。
なので今回の目的にはあまり使われないと思いますが、Intersectは
目的セルを指定(特定)する場合や検証する場合などにはよく使われると思います。

Intersect(ActiveCell.EntireColumn,Range(“3:1000”))は、
Range(Cells(3, ActiveCell.Column), Cells(1000, ActiveCell.Column))
とセル範囲としては、同じです。

代入式=で結ぶ場合は基本的に範囲が同じの=Valueなので
元となる範囲をレンジオブジェクト変数に1度セットしてしまえば、
Offsetで範囲全体を移動するイメージで代入(参照)する事が出来ます。
Dim myRng As Range
Set myRng = Range(Cells(3, ActiveCell.Column), Cells(1000, ActiveCell.Column))
myRng.Offset(1 - myRng.Row(), 1).Value = myRng.Value

myRng.Row()はセットした範囲の初めの行番号、例の場合3
myRng.Offset(1 - myRng.Row(), 1)は、範囲設定を変えても対象行が1行目になるようにするための工夫)
レンジオブジェクト変数には、注意点もありますが別の話として

ResizeやOffsetを調べてくださいね。

回答のResizeやOffsetを理解するとシンプルで読解性が上がるコードが書けると思います。(私は独学の素人なので、うけうりですが、実際とても重宝します)
質問スレッドから離れてしまうので、このくらいで、、
    • good
    • 0
この回答へのお礼

助かりました

めちゃくちゃ理解出来ました!!
説明がすごく判り易いです、そしてDimで変数?に代入する方がしっくりくると思いました!!
ありがとうございます!!
またよろしくお願いいたします。

お礼日時:2021/03/05 19:38

こんにちは



10000行じゃないってことですね?

>Destination:=Columns(ActiveCell.Column + 1)
って、「右にコピー」とは違うと思うけれどどっちなんでしょうかね?

とりあえず。

Range("A3:A1000").Offset(, ActiveCell.Column).Value = _
Range("A3:A1000").Offset(, ActiveCell.Column - 1).Value
    • good
    • 1
この回答へのお礼

ありがとう

ありがとうございます!
大変勉強になりました!!
ものすごくシンプルなのに出来ました!
Range("A3:A1000")この範囲指定だとA列をコピーしそうなのに、私のやりたいことがすごくシンプルに出来ています!
よろしければ解説をお願いしたいのですが。
10000行ではないです。1000行です。
Destination:=Columns(ActiveCell.Column + 1)は右にコピーではなくどんな解釈ですか?
このど素人にどちらも解説をお願いします。

お礼日時:2021/03/05 17:47

こんにちは、


>数値のみコピーしたいです
方法はいくつかありますが、
copyでなく 代入式(=)を使われるのが理解し易いかもしれません。

代入式は、右辺と左辺同じ範囲の.valueで繋ぎます。
ご質問のコードの場合、位置を変えるだけなのでOffsetを使い
Intersect(ActiveCell.EntireColumn, Range("3:1000")).Offset(, 1).Value _
= Intersect(ActiveCell.EntireColumn, Range("3:1000")).Value

のような感じです。
必ず3~1000行までなら
Cells(3, ActiveCell.Column).Resize(998).Offset(, 1).Value _
= Cells(3, ActiveCell.Column).Resize(998).Value
でも良いかも
998の意味は 1000行で始まりが3行目 スタートは1なので
1000-(3-1)=998 判り難くなるかも。。(勧めるべきでないかも)
ちなみに、コピーなら
Intersect(ActiveCell.EntireColumn, Range("3:1000")).Copy
Cells(3, ActiveCell.Column).Offset(, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

隣の3行目に値のみペースト 範囲はExcel任せです。
Application.CutCopyMode = False は 値貼り付けの場合、コピーモードが残るのでコピーモードを解除。
ESCキーを押したのと同じ事になります。
    • good
    • 1
この回答へのお礼

ありがとう

ありがとうございます!!2つ目は範囲指定が少し複雑ですが、どちらも肝は.Valueという事ですね!すごく勉強になりました!!
3つ目のはspecialなpasteで=の後がValueのみという解釈で良いのでしょうか?
前回の質問で最後までお付き合い頂きました方ですよね、ベストアンサーをするとやり取り出来なくなるとしらず。。。

お礼日時:2021/03/05 17:47

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