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

前回質問と同じソースなのですが、質問内容が違う為、新たに質問させていただきました。

★1 毎回繰り返し処理をする時に、ワークシートをセレクトしていますが、このやり方でよいのでしょうか?良い方法がありましたら教えてください。

★2 この繰り返しで、空白ではない場合に変数へ値を入れて処理をしているのですが、何故か新しいシート( _案内)を作成して、空白の部分も抜き取って処理してしまいます。
この場合は、空白の時に処理しない(GoTo でNext iの前に行くなど) の指示を書きこまないといけないのでしょうか?

☆ まだソース書いていませんが、Q列処理後でQ列と同様にS列にも案内場所C(コード)が書かれた時に同じ処理をして、S列i行目がシート名と同じ場所の時に、Q・R列i行を削除して左方向へシフトしたいのですが、 この手順は flag=Trueの部分にQ・R列i行を削除、左方向へシフト の指示を書けば良いのでしょうか?

次々と失敗ばかりで……質問長くなりすみませんが、アドバイスよろしくお願いいたします。

Sub 外注別案内書作成()
Dim ws As Worksheet 'オブジェクト格納
Dim i As Long, j As Long '繰り返す回数格納
Dim annaicode As Variant '案内場所C格納
Dim addwsname As Variant 'シート名前格納(※案内場所名)
Dim flag As Boolean '真偽
Dim r As Range 'Findメソッドの返り値格納

'レポート元でQ列の情報が入っている時に、案内場所別で情報を作成する。
'レポート元でQ列に値がある時に、annaicode変数へ格納。
For i = 2 To Worksheets("レポート元").Cells(Rows.Count, "A").End(xlUp).Row
Worksheets("レポート元").Select
annaicode = ""
If Cells(i, "Q").Value <> "" Then
annaicode = Cells(i, "Q").Value
End If

'外注一覧でannai変数と一致した時に、addwsname変数へ格納。 Findメソッド
With Worksheets("外注一覧").Columns("A")
Set r = .Find(What:=annaicode, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns)
If r Is Nothing Then
MsgBox i & "行目の案内場所Cの入力が不正です。" & vbCrLf & "処理を中断しますね", _
vbOKOnly + vbExclamation, "お知らせ"
Exit Sub
Else
addwsname = r.Offset(0, 1) + "_案内"
End If
End With

'ワークシートオブジェクト内でaddwsname変数と一致した時に、flag変数をTrueにする。
For Each ws In Worksheets
If ws.Name = addwsname Then
flag = True
End If
Next ws

'flag変数の値により、各々処理をする。
If flag = True Then
Worksheets("レポート元").Cells(i, "A").EntireRow.Copy _
Destination:=Worksheets(addwsname).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
flag = False
Else
Worksheets.Add
ActiveSheet.Name = addwsname
Worksheets("レポート元").Rows(1).EntireRow.Copy _
Destination:=Worksheets(addwsname).Rows(1)
Worksheets("レポート元").Cells(i, "A").EntireRow.Copy _
Destination:=Worksheets(addwsname).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
End If

Next i
End Sub

A 回答 (3件)

自分が納得いかない回答に反論するのは、私には好印象です。


(サイト的にはトラブルを極力回避して社交辞令で済ます方を
好対応と評価するのでしょうが)

で、補足を踏まえた上でこちらから更に言わせてもらえば、
> With~End Withもアドバイス通り全て「.」をつけて試しましたが、
> うまく処理されなかった
とか
> GoToを書いて試しましたが動きませんでした。
って基本文法ですよね。動く動かないの世界の話ではありませんよ。
日本語で「主語の後に述語を書く」とかいうレベルのルールです。
ルールを守って書けば動くし、動くように書くルールを覚えるわけです。
その段階で疑問が残ってるのに、「それぞれのコードの意味を理解」
しているとは言えませんよ。

プログラムは、確実に動く基本文法を1つ1つ積み上げていく作業です。
本来なら、そこに疑問など沸かないのです。技術的に特殊な知識を
必要とする、経験やテクニック・裏技を知らないとできない部分も
ありますが、基本文法レベルでそれは無いです。

結局、土台となる基本の知識が不安定の状態で、自分勝手な解釈を
するしかなく、動くサンプルコード1セットを中心にしか考え
られていないのでは?

With~End With に絞って突き詰めた質問をなぜしないのですか?
GoTo に絞って突き詰めた質問をなぜしないのですか?
> 応用、実践でつまずいてるので質問しています。
基本でつまずいてますよね?

この回答への補足

基本が出来ていなくて、
書き方が悪かったので処理できなかったと理解しました。もう一度見直してみます。
ありがとうございました。

補足日時:2011/11/24 19:04
    • good
    • 0

>★1


>★2
 ⇒マクロ記録ならいざ知らずVBAではオブジェクトを記載しましょう。
  回答等を丸映ししているから応用が利かない。もう少しそれぞれのコードの意味を
  理解しましょう。
  余談ですがコード中のコメントはコードを説明するのではなく処理内容を記載しましょう。

 一例です。
  With~End Withで統一しては如何でしょうか。
  Worksheets("レポート元")のオブジェクトを使用している箇所は全て「.」に
  忘れずに変更して下さい

With Worksheets("レポート元")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
If .Cells(i, "Q").Value <> "" Then
annaicode = .Cells(i, "Q").Value
End If ⇒ ★2後述のNext iの直前に移動
 ~
End If
Next i
End With

>☆
 ⇒ ご質問内容がよく判りませんので改めて質問しては如何でしょうか。

この回答への補足

お返事ありがとうございます。
アドバイスいただいているので、このような返事をしたくはなかったのですが、すみませんが、伝えさせていただきます。

>回答等を丸映ししているから応用が利かない。もう少しそれぞれのコードの意味を理解しましょう。
回答いただいた部分は、どういう処理なのかや意味かが書かれていないので、調べてからそれを使っております。
それから、田中亨さんのVBAエキスパート「ベーシック」「ベーシック」公式テキストを読んでいるので少しは解るのですが、応用、実践でつまずいてるので質問しています。

With~End Withもアドバイス通り全て「.」をつけて試しましたが、うまく処理されなかったので、
With~End Withの中にWith~End Withを入れての処理は良くないのかと思いました。
後ほど試してみます。

>End If ⇒ ★2後述のNext iの直前に移動
すみません、理解出来ませんでした。
GoToを使用しても良いということですか?

>☆
 ⇒ ご質問内容がよく判りませんので改めて質問しては如何でしょうか。
★の問題が解決したら書いてみます。

補足日時:2011/11/24 17:57
    • good
    • 0

>ワークシートをセレクトしていますが、このやり方でよいのでしょうか?良い方法がありましたら教えてください



アクティブのオブジェクトに対して、処理する関数、メソッド、プロパティ、など明示的に、オブジェクトを指定しなくても良い。

と言う、決まりごとなので、そのような関数などを使う場合は、それでいいということです。それ以外は、フルパスで指定すればいいだけのこと(オブジェクト.メソッド or プロパティ | Get(Object)関連の関数を使う)。

相対指定(パス)、絶対指定(パス)なんて言う概念と一緒です。

後の答えは、実際に動作するコードを記載してください。解析するの面倒です。

この回答への補足

お返事ありがとうございます。

>と言う、決まりごとなので、そのような関数などを使う場合は、それでいいということです。
書き方はこれで良いという事ですね。解りました。

VBAの勉強を始めたばかりなので、他の2点については、手順や書き方を確認したくて質問上げてみました。
 特にGoToについては、ネットで調べたところエラーの時に使うのは解りますが、それ以外で使用するのはよくなさそうな事も書いてあったので……でも、一度ネットで見た時と同じようにGoToを書いて試しましたが動きませんでした。

質問が悪いようですみませんでした。

補足日時:2011/11/24 16:07
    • good
    • 0

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