Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2835 / 13646 ツリー ←次へ | 前へ→

【65683】二つのマクロを合体したい Zoo 10/6/22(火) 13:44 質問[未読]
【65684】Re:二つのマクロを合体したい かみちゃん 10/6/22(火) 13:56 発言[未読]
【65685】Re:二つのマクロを合体したい Zoo 10/6/22(火) 14:17 質問[未読]
【65686】Re:二つのマクロを合体したい かみちゃん 10/6/22(火) 14:35 発言[未読]
【65691】Re:二つのマクロを合体したい Zoo 10/6/22(火) 15:14 お礼[未読]
【65693】Re:二つのマクロを合体したい かみちゃん 10/6/22(火) 15:36 発言[未読]
【65694】Re:二つのマクロを合体したい Zoo 10/6/22(火) 15:42 お礼[未読]

【65683】二つのマクロを合体したい
質問  Zoo  - 10/6/22(火) 13:44 -

引用なし
パスワード
   教えてください。
別々に作ったマクロを、一つの作業で終わらせたくて
合体させようとしました。
元々は最初のEnd Ifの次にEnd Subとなって終わっていました。
iという位置を出してから、iという位置を元に次の作業に入りたく
このiが共通の位置なので、ひとつの処理にしたいのですが、
以下のコードの最初のEnd Ifの後にある’空白になるまで処理を繰り返す
のところでエラーになってしまいます。
何か書き足りないものがあるのでしょうか。


Sub 分類()
  Dim myRange As Range
  Dim srcName As String
  Dim i As String
  
  srcName = "Education"
  Set myRange = Range("A:A").Find(What:=srcName)
  If Not myRange Is Nothing Then
    myRange.Select
    i = myRange.Offset(2, 1).Select
    
  End If

  Do Until Cells(i, "B").Value = ""
  '空白になるまで処理を繰り返す
    
    If Left(Cells(i, "B").Value, 6) = "D.V.M." Then
      Cells(i, "F").Value = "Master1"
     
    ElseIf Left(Cells(i, "B").Value, 4) = "M.D." Then
      Cells(i, "F").Value = "Master2"
     
    ElseIf Left(Cells(i, "B").Value, 2) = "M." Then
      Cells(i, "F").Value = "Master3"
     
    ElseIf Left(Cells(i, "B").Value, 2) = "D." Then
      Cells(i, "F").Value = "Master4"
     
    Else
      Cells(i, "F").Value = "その他"
     
    End If
    
    i = i + 1
    
  Loop

End Sub

よろしくおねがいいたします。

【65684】Re:二つのマクロを合体したい
発言  かみちゃん  - 10/6/22(火) 13:56 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>以下のコードの最初のEnd Ifの後にある’空白になるまで処理を繰り返す
>のところでエラーになってしまいます。

エラーメッセージを書かれたほうがいいと思います。

コードは検証していませんが、

  Dim i As String
は、
  Dim i As Long
で、

  If Not myRange Is Nothing Then
    myRange.Select
    i = myRange.Offset(2, 1).Select
  End If
  
は、
  
  If Not myRange Is Nothing Then
    i = myRange.Row + 2
  Else
    MsgBox srcName & "がA列にありません。処理を中止します"
    Exit Sub
  End If

としないといけないのではないでしょうか?

【65685】Re:二つのマクロを合体したい
質問  Zoo  - 10/6/22(火) 14:17 -

引用なし
パスワード
   ▼かみちゃん さん:

ご回答ありがとうございました。

>  If Not myRange Is Nothing Then
>    myRange.Select
>    i = myRange.Offset(2, 1).Select
>  End If
>  
>は、
>  
>  If Not myRange Is Nothing Then
>    i = myRange.Row + 2

といただきましたが、i をmyRangeから1列右隣の2行下に格納して
そこをIf 文の参照元にしたいのです。
Offsetではだめですか?

MsgBoxは特に出す必要はなくて、なぜ次のIf文へは進めず
エラーになってしまうのか、そこが知りたいです。
どう繋げたら次のIf文へ進めますか?


>こんにちは。かみちゃん です。
>
>>以下のコードの最初のEnd Ifの後にある’空白になるまで処理を繰り返す
>>のところでエラーになってしまいます。
>
>エラーメッセージを書かれたほうがいいと思います。
>
>コードは検証していませんが、
>
>  Dim i As String
>は、
>  Dim i As Long
>で、
>
>  If Not myRange Is Nothing Then
>    myRange.Select
>    i = myRange.Offset(2, 1).Select
>  End If
>  
>は、
>  
>  If Not myRange Is Nothing Then
>    i = myRange.Row + 2
>  Else
>    MsgBox srcName & "がA列にありません。処理を中止します"
>    Exit Sub
>  End If
>
>としないといけないのではないでしょうか?

【65686】Re:二つのマクロを合体したい
発言  かみちゃん  - 10/6/22(火) 14:35 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>といただきましたが、i をmyRangeから1列右隣の2行下に格納して
>そこをIf 文の参照元にしたいのです。
>Offsetではだめですか?

だめではありませんが、Offsetを使う必要がありません。
ただ、
i をmyRangeから1列右隣の2行下に格納して
ではなく、
myRangeから1列右隣の2行下の何かを i に格納しようとしています。

 i = myRange.Offset(2, 1).Select
で、そもそも、何を格納しようとしているのですか?

>MsgBoxは特に出す必要はなくて

出す必要はないとはなぜそう思うのですか?
If Not myRange Is Nothing Then
でない場合、変数iへの格納処理がされていません。

> なぜ次のIf文へは進めずエラーになってしまうのか、そこが知りたい

すでに説明してあります。

後の変数iの使い方から考えて、
 Dim i As String

 i = myRange.Offset(2, 1).Select
が誤っていると思われます。

変数i は、何を示そうとしているのかを良く考えてください。
その説明がされていないように思います。

【65691】Re:二つのマクロを合体したい
お礼  Zoo  - 10/6/22(火) 15:14 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。

> i = myRange.Offset(2, 1).Select
>で、そもそも、何を格納しようとしているのですか?

列も行もアドレスとして位置を探すのにはそうしなければいけないのかと
思っていました。
Rowにすることでどういう意味になるのかもよくわかりませんでした。

>
>出す必要はないとはなぜそう思うのですか?

こちらも画面上にメッセージボックスがいちいち出るのかと思っていました。


>後の変数iの使い方から考えて、
> Dim i As String
>と
> i = myRange.Offset(2, 1).Select
>が誤っていると思われます。
>
言われたとおり、そのまま書き直したらできていました。
なぜそうする必用があるのかは、今後の勉強です。

ありがとうございました。

【65693】Re:二つのマクロを合体したい
発言  かみちゃん  - 10/6/22(火) 15:36 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>出す必要はないとはなぜそう思うのですか?
>
>こちらも画面上にメッセージボックスがいちいち出るのかと思っていました。

>> If Not myRange Is Nothing Then
>> でない場合、変数iへの格納処理がされていません。

の場合だけ出るメッセージてであることは理解いただけましたか?
今回、Exit Sub とすることで、マクロを終了していますが、
終了したくない場合は、変数i に対して、何かを格納しないといけませんので、
そのあたりは、よく考えてください。

>>後の変数iの使い方から考えて、
>> Dim i As String
>>と
>> i = myRange.Offset(2, 1).Select
>>が誤っていると思われます。
>>
>言われたとおり、そのまま書き直したらできていました。
>なぜそうする必用があるのかは、今後の勉強です。

ポイントは、変数i を何のために使っているのかということです。
Cells(i, "B").Value
は、どういう意味なのかを考えてみて、以下のコードを試してみてください。
変数の内容の違いが確認できるようにしてあります。

Sub TEST()
 Dim myRange As Range
 Dim i As String
 Dim j As Long
 Dim k As Long
 
 Set myRange = Range("A1")
 
 i = myRange.Offset(2, 1).Select
 
 j = myRange.Offset(2, 1).Row
 k = myRange.Row + 2
 
 MsgBox "変数i の内容は " & i
 MsgBox "変数j の内容は " & j
 MsgBox "変数k の内容は " & k
End Sub

【65694】Re:二つのマクロを合体したい
お礼  Zoo  - 10/6/22(火) 15:42 -

引用なし
パスワード
   ▼かみちゃん さん:

ご丁寧にありがとうございました。
今後の理解のために、これを実践にして覚えようと思います。
ありがとうございました。


>こんにちは。かみちゃん です。
>
>>>出す必要はないとはなぜそう思うのですか?
>>
>>こちらも画面上にメッセージボックスがいちいち出るのかと思っていました。
>
>>> If Not myRange Is Nothing Then
>>> でない場合、変数iへの格納処理がされていません。
>
>の場合だけ出るメッセージてであることは理解いただけましたか?
>今回、Exit Sub とすることで、マクロを終了していますが、
>終了したくない場合は、変数i に対して、何かを格納しないといけませんので、
>そのあたりは、よく考えてください。
>
>>>後の変数iの使い方から考えて、
>>> Dim i As String
>>>と
>>> i = myRange.Offset(2, 1).Select
>>>が誤っていると思われます。
>>>
>>言われたとおり、そのまま書き直したらできていました。
>>なぜそうする必用があるのかは、今後の勉強です。
>
>ポイントは、変数i を何のために使っているのかということです。
>Cells(i, "B").Value
>は、どういう意味なのかを考えてみて、以下のコードを試してみてください。
>変数の内容の違いが確認できるようにしてあります。
>
>Sub TEST()
> Dim myRange As Range
> Dim i As String
> Dim j As Long
> Dim k As Long
> 
> Set myRange = Range("A1")
> 
> i = myRange.Offset(2, 1).Select
> 
> j = myRange.Offset(2, 1).Row
> k = myRange.Row + 2
> 
> MsgBox "変数i の内容は " & i
> MsgBox "変数j の内容は " & j
> MsgBox "変数k の内容は " & k
>End Sub

2835 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free