ここから本文です

マクロボタンで実行すると・・

ano********さん

2011/11/2212:08:22

マクロボタンで実行すると・・

Sub prog25()
Application.ScreenUpdating = False
Dim sh1 As Worksheet, sh2 As Worksheet
Dim lastRow1 As Long, lastRow2 As Long
Dim i As Long
Dim n As Long
Dim myData As Variant
Set sh1 = Worksheets("名簿")
Set sh2 = Worksheets("Sheet2")
With sh1
lastRow1 = .Range("E" & Rows.Count).End(xlUp).Row
If lastRow1 = 1 Then Exit Sub
myData = .Range("E11:AA" & lastRow1).Value
For i = LBound(myData) To UBound(myData)
Next i
End With
With sh2
lastRow2 = .Range("B" & Rows.Count).End(xlUp).Row + 3
.Range("B" & lastRow2).Resize(UBound(myData), UBound(myData, 2)).Value = myData
End With
Sheets("Sheet2").Range("B4:B65536").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Sheets("Sheet2").Select
Range("A" & Rows.Count).End(xlUp).Offset(1, 1).Select
For n = 1 To Range("Z2").Value 'Range("A" & Rows.Count).End(xlUp).Offset(1, 1) To Range("A" & Rows.Count).End(xlDown).Row '"Z2"
SendKeys "{F2}"
SendKeys "{enter}"
Next
Application.ScreenUpdating = True
Sheets("名簿").Select
End Sub

上記マクロを実行するとSendkeysがシート名簿で行われます。なぜでしょうか?
また、最後のSheets("名簿").Selectを消すとやりたい動きになるのですが、①sheet2を画面に表示させないか、②最後にシート名簿に戻りたいのですが、どうしたらよろしいのでしょうか?出来れば①のsheet2に移動せず(表示させず)にSendkeysを行いたいのでお願いします。

補足シート名簿C列にチェックボタンを配置しB列とリンク。B列TRUEの場合E~AAまでの情報をsheet2B4~X4に転記し、下に蓄積されていく形にしたいのですが、全て転記されてしまうためデリート作業によって不必要なデータを削除しています。sheet2A列にはシートマクロによってナンバーを配置するのですが、F2+enterをしなければナンバーが発動しない状態です。最後にシート名簿に戻るも含め、改善構文等教えていただければ助かります。

閲覧数:
320
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

por********さん

編集あり2011/11/2218:42:10

こんにちは。
screenupdateをfalseにした状態で、sendkeysを実行したら、エクセルでは動作保証がないです。
対策は、sendkeysを使わない、selectをしない、で、実行できるように、コードを修正する、ということになります、

コードを見て、「何がしたい」というのが、分からないです。
シートなにがしのデータどこから、どこまでの最終行までのデータをコピーして、目的シートの最終行の部分に貼り付けしたい、
と、文章がないと、コードになりません。

データの初期化は、もとのデータを操作する前に、初期化の処理を終わらせるようにしてください。

コピー、貼り付け、は、一行でできるような、状況です。
range(コピー範囲).copy destination:=sheets("sheet2").range("B" & v転記行)
これで、selectしなくても、データをコピー貼り付けできます。
もし、一行ずつループしたい場合、v転記行を都度計算して、一行ずつコピー貼り付けしたらいいです。
値で貼り付けしないといけない場合は、そのためのコードがあります。

まずは、状況の整理と、エクセルが正しく動作しやすいコードを考えたものにしてください

>補足より
for i=11 to lastRow1
if sh1.range("B" & i).value = true then
'一行コピーの処理
end if
next
コントロールが接続してある部分が、B列ですから、正しいデータだけを選択して、ピンポイントでコピーしたらいいです。
コピーしてから、削除するときに、コントロールもコピーしていたら、エクセルはすぐに限界になります。
コピーは最小限のほうがいいです。

ベストアンサー以外の回答

1〜1件/1件中

dre********さん

2011/11/2213:37:33

内容の確認をしていないので一般的なことを書きます。

>> Sendkeysがシート名簿で行われます <<
sendkeysはアクティブになっている部分に対して実行されます。
Application.ScreenUpdating = falseになっているので
trueに戻した段階で実行されるのでしょう。


>> ①sheet2を画面に表示させないか <<
最初に別のシートを表示させておき、sheet2に関するコードでselectを使わない書き方にすればいいですが、
sendkeysを「名簿」シートに対して使いたいなら表示させないわけにはいきません。

その他
rangeの使い方ですが、シートを指定している部分と指定していない部分が混在し、画面表示を抑制しているので、シートを間違っていてもどうなっているのか、どうしたいのかわかりにくくなっています。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる