Excel VBA質問箱 IV

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

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


721 / 13645 ツリー ←次へ | 前へ→

【78755】型が一致しないエラーについて VBA勉強中 17/1/14(土) 11:47 質問[未読]
【78756】Re:型が一致しないエラーについて γ 17/1/14(土) 13:40 回答[未読]
【78757】Re:型が一致しないエラーについて VBA勉強中 17/1/14(土) 14:14 お礼[未読]
【78758】Re:型が一致しないエラーについて γ 17/1/14(土) 14:42 発言[未読]
【78759】Re:型が一致しないエラーについて γ 17/1/15(日) 9:03 回答[未読]

【78755】型が一致しないエラーについて
質問  VBA勉強中  - 17/1/14(土) 11:47 -

引用なし
パスワード
   以下自分で書いてみたものです。
原因はrange型の変数とstring型の変数を=で結んだからかな?と予想していますが、どう書き換えたらいいのかわかりません。ご教授お願いします…

Sub test()
Application.ScreenUpdating = False

  Dim sh1 As Object
  Dim pos1 As Range
  Dim pos1row As Long
  Dim pos1col As Long
  Dim name1 As String
  Dim name2 As String
  Dim name3 As String
  Dim name4 As String
  Dim name5 As String
  Dim name6 As String
  Dim name7 As String
  Dim name8 As String
  Dim name9 As String
  Dim memo As Range
  
  Set sh1 = Sheets("sheet1")
  
  pos1col = 8
  pos1row = 5
  Set pos1 = Cells(pos1row, pos1col).MergeArea
  Set memo = pos1.Offset(, 7)
  
  Do While Not IsEmpty(pos1)
    name1 = "a"
    name2 = "b"
    name3 = "c"
    name4 = "d"
    name5 = "e"
    name6 = "f"
    name7 = "g"
    name8 = "h"
    name9 = "i"
      Select Case pos1.Value
          Case Is = name1
            memo = "aa"
          Case Is = name2
            memo = "bb1" & Right(pos1.Offset(, 3).Value, 5) & "bb2" _
              & Left(pos1.Offset(, 3).Value, 4) & "bb3"
          Case Is = name3
            memo = bb1" & Right(pos1.Offset(, 3).Value, 5) & "bb2" _
              & Left(pos1.Offset(, 3).Value, 4) & "bb3"
          Case Is = name4
            memo = pos1.Offset(, 3).Value & "dd"
          Case Is = name5
            memo = "ee"
          Case Is = name6
            memo = "ff"
          Case Is = name7
            memo = pos1.Offset(, 3).Value & "gg"
          Case Is = name8
            memo = "hh"
          Case Is = name9
            memo = pos1.Offset(, 3).Value & "ii"
      End Select
      
    pos1row = pos1row + 1
    Set pos1 = sh1.Cells(pos1row, pos1col).MergeArea
    
  Loop


End Sub

【78756】Re:型が一致しないエラーについて
回答  γ  - 17/1/14(土) 13:40 -

引用なし
パスワード
   つっこみどころがいくつかあります。

型の不一致ですが、それは、pos1が結合セルの場合、
pos1.Valueが配列になるからです。

配列と一つの値を = で比較することはできません。

まずそのことを念頭におくと、
  Set pos1 = Cells(pos1row, pos1col).MergeArea
  Set pos1 = pos1(1)
としてしまう方法があります。
(最初だけでなく、複数箇所変更が必要です)

その他。

(1)1行ずつ行送りすると無駄かもしれない。
  pos1row = pos1row + sh1.Cells(pos1row, pos1col).MergeArea.Rows.Count
  とするとよいかも。

(2) name1,name2などを繰り返しの中で定義する必要はない。

(3) memo = "ee" などとダイレクトに文字をコードに書くなら、
  name1 などと変数を使わないほうが直感的かもしれない。
  memo に書き込む値も文字列変数で定義するか、いずれ統一が必要。

(4)Case Is = name1 は、普通は Case name1 で良い。

(5)投稿にあたっては、コピーペイストしてください。
  memo = bb1" & Right(pos1.Offset(, 3).Value, 5) & "bb2" _
                & Left(pos1.Offset(, 3).Value, 4) & "bb3"
  などというのはコンパイルエラーになる。
(6)インデントが恣意的です。タブを使ってください。

【78757】Re:型が一致しないエラーについて
お礼  VBA勉強中  - 17/1/14(土) 14:14 -

引用なし
パスワード
   ▼γ さん:
ありがとうございます!
型の不一致の問題、その他の問題も解決し意図した通りに動きました!
>まずそのことを念頭におくと、
>  Set pos1 = Cells(pos1row, pos1col).MergeArea
>  Set pos1 = pos1(1)
>としてしまう方法があります。
>(最初だけでなく、複数箇所変更が必要です)
変数名(インデックス番号)で扱うことができるのですね
また、配列について調べていると最初に同じ型、同じような変数をたくさん定義するのがいかに無駄になるかわかりました。ありがとうございます

今回は無事に動きましたので特に修正はしないと思いますが、次回からはタブ、配列を念頭に置いて、見やすいものをかけるように心がけます。

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

【78758】Re:型が一致しないエラーについて
発言  γ  - 17/1/14(土) 14:42 -

引用なし
パスワード
   ああ、単に
Set pos1 = Cells(pos1row, pos1col)
だけで良かったですね。

次のpos1に進めるときは、
提案の形で、結合セルの行数を調べたほうがよいとは思うが。

【78759】Re:型が一致しないエラーについて
回答  γ  - 17/1/15(日) 9:03 -

引用なし
パスワード
   >型の不一致の問題、その他の問題も解決し意図した通りに動きました!
どんな風にされたのか、折角ですから示して欲しいものですね。
それは閲覧しているかたにも参考になりますしね。

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