[[20181130125226]] 『プロシージャの呼び出し、または引数が不正です』(たかと) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『プロシージャの呼び出し、または引数が不正です』(たかと)

特定のモジュールのみでプロシージャの呼び出し、または引数が不正です
とメッセージが出ます

標準モジュールAとBがあった時
Aでエラーとなり、Bでは正常に動きます
Aにはほかにプロシージャをいくつもいれています

ActiveSheet.Range("C" & RowB3 + 1 & ":L" & RowB4).RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Header:=xlNo

この部分でエラーになります

考えられる原因はどんなものがあるのでしょう
宜しくお願いいたします

< 使用 Excel:unknown、使用 OS:unknown >


 可能性の一つとして。
 シートの保護がかかっているとそのエラーになるようだがAの場合にはシートの保護が
 かかっていたりしないだろうか?
 もし、かかっていたりしない場合でもAの場合とBの場合でシートの条件が違っていたりしないだろうか?
(ねむねむ) 2018/11/30(金) 13:14

 Columunsで10列目まで指定してるのに、
 データが9列目までしかなかったりするとそのエラーが出ます。

 ActiveSheetとなっているので、
 モジュールが違うことが原因ではなくてシートが違ってるのだと思います。
 もしくは、データが10列じゃない時がたまにあるとか??

 ねむねむさんの意見が気になってやってみたら
 保護されたシートに対してこのコマンドは実行できません
 と出ました。バージョンによるんでしょうか。
(TAKA) 2018/11/30(金) 13:33

 こちらでは2010でシート保護の状態で実行して
 >実行時エラー1004 プロシージャの呼び出し、または引数が不正です 
 となっている。
 また、全くデータのない白紙のシートでもエラーにはなっていない。
 そこらへんもバージョンの違いがあるのだろうか?
(ねむねむ) 2018/11/30(金) 13:44

 >Columunsで10列目まで指定してるのに、
 >データが9列目までしかなかったりするとそのエラーが出ます。
 ああ、これは
 RANGE("C1:E3")
 とデータの指定範囲が3列しかないのにColumns:=で4を指定しているとかの場合か。
(ねむねむ) 2018/11/30(金) 13:49

 もそうですし、
 Range("C1:E3")
 とデータの指定範囲が3列なのにE列が全部空欄の時も出ます。
(TAKA) 2018/11/30(金) 13:54

'以下は narabikae 用
Option Base 1
Const COL_COUNT As Integer = 11
Const ORDER As String = ",10,11,1,2,3,4,5,6,7,8,9"

Private Sub narabikae()
'列の順番を入れ替え

    Cells.Replace vbLf, ":"
    Dim rng(COL_COUNT) As Range
    Dim aryOrder As Variant
    Dim i As Integer

    '列を配列にセット
    For i = 1 To COL_COUNT
        Set rng(i) = Columns(i)
    Next
    '並び順をセット
    aryOrder = Split(ORDER, ",")
    For i = 1 To COL_COUNT
        '移動元列と移動先が一緒か判断(一緒であれば移動処理しない)
        If rng(aryOrder(i)).Column <> i Then
            '移動処理
            rng(aryOrder(i)).Cut
            Columns(i).Insert xlShiftToRight
        End If
    Next
End Sub
この別の処理用に使用しているプロシージャの

Option Base 1
Const COL_COUNT As Integer = 11
Const ORDER As String = ",10,11,1,2,3,4,5,6,7,8,9"

ここを削除すると正常に動作します
この処理は一連の処理の中で行っているため消すわけにはいきません
どのように回避すればいいでしょうか?

宜しくお願いいたします
(たかと) 2018/11/30(金) 13:55


 私は2013で、
 白紙のシートではエラーになります。

 やっぱりバージョンの違いがあるみたいですね
(TAKA) 2018/11/30(金) 13:56

 Const ORDER As String = ",10,11,1,2,3,4,5,6,7,8,9" 

 Const ORDER As String = "10,11,1,2,3,4,5,6,7,8,9" 

 にしたら動きませんか?
 10の前のカンマが原因では。。。
(TAKA) 2018/11/30(金) 14:00

  >データの指定範囲が3列なのにE列が全部空欄の時も出ます。
 あ、本当だ。
 全くデータのない場合だとエラーにならなかったのでデータのある列とデータのない列が
 混在している場合を試していなかった。
(ねむねむ) 2018/11/30(金) 14:03

TAKAさん
試しましたがダメでした
Option Base 1
Const COL_COUNT As Integer = 11
Const ORDER As String = ",10,11,1,2,3,4,5,6,7,8,9"
以下の部分が常に格納されている状態がいけないみたいです
ここをプロシージャ内に格納することはできないでしょうか?
(たかと) 2018/11/30(金) 14:05

原因は「Option Base 1」のようですね。 指定なし(デフォルトは「Option Base 0」)に考え直せませんか?

Option Base 1にしていても、Variant型にSplitすると、0番目から格納されているようですし、カラム指定の個数にも影響しているのかもです。
(???) 2018/11/30(金) 14:12


Splitしたときの説明が変か。 Option Base 1だと、Variant型変数の1から個数分までに格納されますが、ローカルウィンドウ上では値の入っていない0番目も存在するのです。

RemoveDuplicatesメソッドはOption Baseを見ていないという可能性を思うと、Excelのバグっぽい動作ですが、Columns指定も同様になっていると仮定。 10列あるのにColumnsは11個ある、という状態になって、エラーになっているのでは?、と思いました。
(???) 2018/11/30(金) 14:19


???さん
Range("C" & RowB3 + 1 & ":L" & RowB4)
と10列を指定していると思うのですが
別モジュールにこのプロシージャを入れた場合は問題なく動いています

作業工程を2段階に分けて
作業1モジュールにPrivate Sub narabikaeを含む作業
作業2モジュールにそれ以降の作業
と分けて動かしたところ正常動作しました

とりあえず作業を2段階に分けて対応することにしました
皆様お騒がせしました
(たかと) 2018/11/30(金) 14:44


 RemoveDuplicate の第一因数の配列は 0 Base の 1D 配列でなければなりません。

 Option Base 1 に拘るなら

 VBA.Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)に変更

(seiya) 2018/11/30(金) 15:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.