こんにちは、お世話になっています。
表題のとおり、VBA内でコピペした値が、コピペ先の書式で表示ができなくて困っています。
状況としては、「指定したシート1上の範囲内のセルの文字列をコピーし、シート2で指定したセル内にペーストする」ということを行いたいのですが、貼り付けた値はコピペ元の書式で表示されてしまい、一度各セルをアクティブにしないとシート2の書式が適用されません。
どうすればアクティブにしなくても正常表示できるか、お知恵を貸してください。
なお、作成にあたり以下の条件があります。
(1)運用時に全シートはパスワード保護されるため、値に対しての入力や修正、及びショートカットやボタンによる動作は不可
(2)コピー元の書式は「文字列」固定、コピー先の書式は「ユーザー定義」固定で、さらに各行ごとに定義が異なる
(3)当マクロはファイル呼出時に自動的に実行される
以下、ソースコードになります(Excel2003 SP3、VB6.5で作成)
Dim first_Row As Integer 'シート1のデータ先頭行
Dim first_Col As Integer 'シート1のデータ先頭列
Dim last_Row As Integer 'シート1のデータ最終行
Dim last_Col As Integer 'シート1のデータ最終列
Dim first_KeyNo As Integer 'シート2のキー番号先頭行
Dim last_KeyNo As Integer 'シート2のキー番号最終行(今回省略)
(中略、↑のデータを各ワークシートからセット)
Dim i As Integer 'シート1のカウント用変数
Dim k As Integer 'シート2のカウント用変数
i = first_Row
k = first_KeyNo
'データ最終行になるまで処理を繰り返す
Do While(i >= first_Row and i < last_Row)
'シート1と2のキーNoがイコールならセット
If Worksheets("シート1").Cells(k, 1).Value = Worksheets("シート2").Cells(i, 2).value Then
Worksheets("シート1").Range(Cells(i, first_Col),Cells(i, last_Col).Copy
Worksheets("シート2").Range(Cells(k, 1),Cells(k, 20).PasteSpecial paste:=xlValues
Application.CutCopyMode = False
'イコールでないなら、イコールになるまでシート2のキー番号を検索
ElseIf Then
(中略)
EndIf
i = i + 1
k = k + 1
Loop
VBAは今回初めて作成するので、見づらいかと思いますがよろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんばんは。
何か、凝った書き方していますが、難しい書き方になっているような気がします。
もう少し、楽に書いたほうがよいと思います。
内容的にはっきりしない部分がありますが、ペーストするときに、20列にしたいなら、コピーするときに、20列にすればよいです。Range プロパティの中で、Cells を指定すると、親オブジェクトとは共有していません。文字列の、"A1" などと入れるか、Resize で、範囲を広げます。
'-------------------------------------------
If Worksheets("シート1").Cells(k, 1).Value = Worksheets("シート2").Cells(i, 2).Value Then
Worksheets("シート1").Cells(i, first_Col).Resize(,20).Copy
Worksheets("シート2").Cells(k, 1).PasteSpecial Paste:=xlPasteValues
''Application.CutCopyMode = False ''マクロが終了する直前に入れること(ループ内では不要)
'-------------------------------------------
ただし、
If Worksheets("シート1").Cells(k, 1).Value = Worksheets("シート2").Cells(i, 2).value Then
シート2 の2列目で比較して、
Worksheets("シート2").Range(Cells(k, 1),Cells(k, 20))
と貼り付けるわけですから、1 列目に貼り付けるわけですから、場合によっては上書きもありうるということだと解釈しています。
回答ありがとうございます。
固定範囲にしていないのは、このVBAの処理を別ファイルでも流用し、かつ各ファイルごとにシート1でコピーする列数が異なるため、なるべくハードコーティングを行いたくないからです。
また、行数も異なり、シート2上にキー番号が存在していてもシート1上に対応するキー番号がない可能性があるため、ループ処理にしています。
それと、Rangeプロパティ中にCellsを記述していないのは文字数の都合上省略したためです。
実際のソースでは記述し、動作テストは完了しています。
混乱させてしまい、申し訳ありません。
>If Worksheets("シート1").Cells(k, 1).Value = Worksheets("シート2").Cells(i, 2).value Then
>シート2 の2列目で比較して、
>Worksheets("シート2").Range(Cells(k, 1),Cells(k, 20))
>と貼り付けるわけですから、1 列目に貼り付けるわけですから、場合によっては上書きもありうるということだと解釈しています。
これは完全に、当方の質問に書き込んだ際の記述ミスです。
シート1はどちらもk、シート2ではiを使って処理させています。
No.2
- 回答日時:
こんばんは。
Rangeの前だけではなく、Cellsの前にもWorksheetsを指定する必要があります。
例えば、以下は
Worksheets("シート1").Range(Cells(i, first_Col),Cells(i, last_Col))
↓
Worksheets("シート1").Range(Worksheets("シート1").Cells(i, first_Col),Worksheets("シート1").Cells(i, last_Col))
または
With Worksheets("シート1")
.Range(.Cells(i, first_Col),.Cells(i, last_Col))
End With
のように記述する必要があります。
Worksheets("シート2").Range(Cells(k, 1),Cells(k, 20))
も同様に変更が必要です。
例えば
With Worksheets("シート2")
.Range(.Cells(k, 1),.Cells(k, 20))
End With
お試しください。
回答ありがとうございます。
No1の方へのお礼にも書きましたが、Rangeプロパティ中にCellsを記述していないのは文字数の都合上省略したためです。
実際のソースでは記述し、動作テストは完了しています。
混乱させてしまい、申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで同じシートのコピーを一...
-
EXCEL:同じセルへどんどん足し...
-
エクセルの複数シートの保護を...
-
エクセルで前のシートを連続参...
-
別シート参照のセルをシート毎...
-
EXCELで1ヶ月分の連続した日付...
-
VBAでシートコピー後、シート名...
-
前の(左隣の)シートを連続参...
-
エクセルVBAでパスの¥マークに...
-
【Excel関数】値が合致するセル...
-
Excelの複数ファイルの複数行を...
-
excelでシート毎の最終更新日を...
-
VBAでシート1のデータを他シー...
-
EXCELで同一フォーマットのシー...
-
条件式書式に入力する式
-
別シートの最終行に貼り付けす...
-
エクセルシート毎の権限について
-
EXCELで参照シート名含む計算式...
-
EXCEL VBAで別のシー...
-
VBA セルの値と同じ名前のシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで同じシートのコピーを一...
-
エクセルの複数シートの保護を...
-
エクセルVBAでパスの¥マークに...
-
前の(左隣の)シートを連続参...
-
Excelで金銭出納帳。繰越残高を...
-
EXCEL:同じセルへどんどん足し...
-
EXCELで1ヶ月分の連続した日付...
-
シートの保護のあとセルの列、...
-
別シート参照のセルをシート毎...
-
エクセルでファイルを開いたと...
-
EXCELで同一フォーマットのシー...
-
エクセルで前のシートを連続参...
-
エクセルで前シートを参照して...
-
VBAでシートコピー後、シート名...
-
Accessのスプレッドシートエク...
-
エクセルのシート名をリスト化...
-
複数シートの特定の位置に連番...
-
Excelのシートを、まとめて表示...
-
エクセル 計算式も入っていない...
-
スプレッドシートの関数VLOOKUP...
おすすめ情報