すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

VBAでシート間コピーのコードは
Worksheets("Sheet1").Range("A1").Copy Worksheets("Sheet2").Range("C2")
このように記述できると思います。

でもこれだと値も書式もなにもかもコピーされてしまいます。
値のみを貼り付けたいと思っているのですが、コードの後にSpecialPasteをつけても動いてくれません。
どのように記述すれば良いのでしょうか?

===補足===
いくつかのセルではなく18列200行ほどを一気にコピーしたいのです。
列数は決まってますが行数は決まってません。
オートフィルタで空白以外の列を抽出してそれを別シートにコピー、
というふうにするのですが元のシートに条件付書式があってそれはコピーしたくない、と。
はじめに書いたコードにこだわっているわけではないのですが、
どうにかする方法があるはずだと気になってしまって。
どなたかお知恵拝借させてください。

  • 質問者:昼寝
  • 質問日時:2008-12-18 16:03:24
  • 0

値のみのコピーの場合、「Sheet2のC2に、Sheet1のA1の値を入れる」という処理にします。
こんな感じになりますね。
Worksheets("Sheet2").Range("C2") = Worksheets("Sheet1").Range("A1")

===補足===
・18列200行ほどを一気にコピーする。
・空白列以外を抽出してコピーする。
この2点だけでコードを書くと、こんな感じになります。

----ここから----
' コピー元のシート名
Public Const SRC_SHEET_NAME As String = "Sheet1"
' コピー元のシート名
Public Const DEST_SHEET_NAME As String = "Sheet2"

' コピー元の行インデックス(開始)
Public Const START_ROW_INDEX As Integer = 1
' コピー元の行インデックス(終了)
Public Const END_ROW_INDEX As Integer = 300
' コピー元の列インデックス(開始)
Public Const START_COLUMN_IDEX As Integer = 1
' コピー元の列インデックス(終了)
Public Const END_COLUMN_IDEX As Integer = 18

Sub hoge()
' 1列の値の配列
Dim values() As Variant
' コピー先の列インデックス
Dim destColumnIndex As Integer
' 空白フラグ
Dim isNull As Boolean

Application.ScreenUpdating = False

' 変数の初期化
ReDim values(END_ROW_INDEX - START_ROW_INDEX + 1)
destColumnIndex = START_COLUMN_IDEX
isNull = False

' 列のループ
For ColumnIndex = START_COLUMN_IDEX To END_COLUMN_IDEX
' 行のループ
For RowIndex = START_ROW_INDEX To END_ROW_INDEX
' 値を取得
values(RowIndex - START_ROW_INDEX + 1) _
= Worksheets(SRC_SHEET_NAME).Cells(RowIndex, ColumnIndex)
' 空白の判定
isNull = isNull Or (values(RowIndex - START_ROW_INDEX + 1) <> "")
Next RowIndex

' 1列の中に空白データ以外が含まれている場合、コピーを行う
If (isNull) Then
' 行のループ
For RowIndex = START_ROW_INDEX To END_ROW_INDEX
' コピー処理
Worksheets(DEST_SHEET_NAME).Cells(RowIndex - START_ROW_INDEX + 1, destColumnIndex) _
= values(RowIndex - START_ROW_INDEX + 1)
Next RowIndex
' コピー先の列インデックスをインクリメント(次の列に移動)
destColumnIndex = destColumnIndex + 1
isNull = False
End If

' 配列の初期化
ReDim values(END_ROW_INDEX - START_ROW_INDEX + 1)
Next ColumnIndex

Application.ScreenUpdating = True
End Sub
----ここまで----

空白セルの処理をどのようにするのか、コピー先のセルをどこにするのか、
こういった点が不明ですので、そういったところは適当にしてあります。

  • 回答者:匿名希望 (質問から50分後)
  • 0
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

コードまで書いてくださってありがとうございます。
コードの中身見させていただきましたが、まだきちんと把握できてません。

結局自己解決というか解決は全然してないのですが
仕事で使うものですのでとりあえず処理できるようにしてしまいました。

まだまだ勉強始めたばかりでとりあえずわからないことには
どんどん挑戦していこうと思っているので提示していただいたコードは
ちゃんと理解できるまで見てみます。

何度もお付き合いいただきありがとうございました。

関連する質問・相談

Sooda!からのお知らせ

一覧を見る