質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

17107閲覧

With ThisWorkbook.Worksheetsが効かない

mimicon

総合スコア26

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/09/18 13:08

編集2018/09/18 22:39

下記は、シート1の内容を残したまま、編集したい箇所がある為、シート2を複製させて、
Sub Test3()にあるような、セルの削除やコピペ、時間の計算を行う為のプログラムです。
Sub Test3()内のDim i As Integer以降の動作をWith ThisWorkbook.Worksheets("変換結果")※sheet2で行いたいのですが、Sheet1内で動作が行われてしまいます。With ThisWorkbook.Worksheets("変換結果")〜End Withで囲まれているので反応するかと思ったのですが、この場合どのように記述すればよろしいでしょうか。また、.Columns(6).Delete〜の作業は、ThisWorkbook.Worksheets("変換結果")※sheet2で行われます。
初心者ですので、なるべく簡単なプログラムにしていただけると幸いです。よろしくお願いいたします。

vba

1 2Sub Test1() 3 Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count) 4End Sub 5 6Sub test2() 7 Worksheets("Sheet1 (2)").Name = "変換結果" 8End Sub 9 10Sub Test3() 11With ThisWorkbook.Worksheets("変換結果") 12 .Columns(6).Delete 13 .Columns(3).Insert 14 .Columns(4).Copy Destination:=.Columns(3) 15 16 Dim i As Integer 17 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row 18 Dim rng As Range 19 20 For Each rng In Cells(i, 3) 21 rng.Value = rng.Value + 0.375 22 Next 23 Next 24 End With 25 26End Sub 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaHiroaki

2018/09/18 13:57 編集

前回の質問がクローズされていません。少なくとも、前回のアドバイス受け、ステップ実行等を実施し、どのエラーメッセージにつまづいているのかを具体的に示すのがマナーではないでしょうか。
imihito

2018/09/18 21:55

ソースコードの直前の行に「```vba」、直後の行に「```」を追加して、ソースコードにシンタックスハイライトが適用されるようにしてください
guest

回答2

0

ベストアンサー

実際に動作させてみての回答ではありませんが、ぱっとみて
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
とか
For Each rng In Cells(i, 3)
のあたりのCellsがWith対応の記述になっていない(つまり現在のアクティブシートを参照している)ところが気になります。

With直後の列削除・追加・コピーは目的のシートにできていて、ループ処理の足し算だけが目的のシートで行われていないようでしたらコレが原因かと思います。
ご確認ください。


余談ですが、①シートをコピーして②シート名を変える、というところまで一連の流れで行うようでしたら、

Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = "変換結果"

とするのが一般的で、確実かと思います。
コピー直後なら結果のシートがアクティブシートで取れるからです。

シート名で探そうとすると、すでに他作業でSheet1がコピーされていてSheet1(2)が存在すると、今回のコピーで作成したシートはSheet1(3)などにずれたりするので意図せぬ結果になりかねないですよね。

ご質問内容とは関係ないことですが、ご参考までに。

投稿2018/09/19 00:47

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimicon

2018/09/19 03:03

ご回答ありがとうございます. With対応の記述がわからなかった為、調べたのですが、 With〜とDim〜、for〜のようなものが一緒になっているものがなく ``` With ThisWorkbook.Worksheets("変換結果").Cells(i, 3) Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Dim rng As Range For Each rng In Cells(i, 3) rng.Value = rng.Value + 0.375 Next Next End With End With ``` 上記のように記述してみたのですが、For i =を指定する前に.Cells(i, 3)と書いてしまっているからか、コンパイルエラー:変数が定義されていません。と表示されてしまいます。 ですので、With ThisWorkbook.Worksheets("日本時間への変換結果").Range("C:C")にしたところ、時間が足されず、ただ複製されたものが表示されます。 恐れ入りますが、もう少々教えていただけますと幸いです。 また、①シートをコピーして②シート名を変えるにつきましては、回答者様の教えてくださった通りにしてみたところ1つのオブジェクトにまとめることができました。ありがとうございます。
jawa

2018/09/19 04:53 編集

`With句`がどのようなものかはご存知でしょうか? [OfficeTANAKAさんの説明](http://officetanaka.net/excel/vba/beginner/16.htm)が非常にわかりやすいのですが、要は ``` ○○.Value = 123 ○○.ForeColor = vbRed ○○.BackColor = vbBlue ``` といった具合に、あるオブジェクトに対していくつかの操作を行う場合、最初に「対象は○○です」と宣言することで「○○」の記述を省略できるようにするものです。 ``` With ○○ .Value = 123 .ForeColor = vbRed .BackColor = vbBlue End With ``` といった具合です。 シートで考えてみます。 ``` WorkSheets("Sheet1").Cells("A1") = 1 WorkSheets("Sheet1").Cells("A2") = 2 WorkSheets("Sheet1").Cells("A3") = 3 ``` なら ``` With WorkSheets("Sheet1") .Cells("A1") = 1 .Cells("A2") = 2 .Cells("A3") = 3 End With ``` と書くことができます。 ここで注意が必要なのは、省略するのはオブジェクト名の部分だけなので、省略したオブジェクトを参照するものは必ず「.」から始まるというところです。 つまり ``` Width WorkSheets("Sheet1") .Cells("A1") = 1 .Cells("A2") = 2 Cells("A3") = 3 End With ``` のようになっていると、最後の`Cells("A3") = 3`だけはSheet1ではなくアクティブシートを参照してしまう、ということです。 今回でいうと、For文として記述されているCellsが「.」から始まっていないため(ループ範囲も、取得するrngも)アクティブシートを対象に動作しているところが問題だと思います。
mimicon

2018/09/19 04:46

大変わかりやすくありがとうございます。理解できました。仰る通りCellsの前に.をつけたところ、やっとできました。
guest

0

こちらで回答させて頂いている通りの事です。
https://teratail.com/questions/146000

投稿2018/09/19 00:23

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問