Excel VBA質問箱 IV

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

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


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

【34775】IsNumericでエラーがでてしまいます さちきょん 06/2/12(日) 10:55 質問[未読]
【34777】Re:IsNumericでエラーがでてしまいます やっちん 06/2/12(日) 11:14 発言[未読]
【34778】Re:IsNumericでエラーがでてしまいます かみちゃん 06/2/12(日) 11:16 発言[未読]
【34779】Re:IsNumericでエラーがでてしまいます Hirofumi 06/2/12(日) 11:39 回答[未読]
【34798】Re:IsNumericでエラーがでてしまいます さちきょん 06/2/13(月) 12:48 発言[未読]
【34799】Re:IsNumericでエラーがでてしまいます やっちん 06/2/13(月) 13:00 発言[未読]
【34801】Re:IsNumericでエラーがでてしまいます さちきょん 06/2/13(月) 13:23 発言[未読]
【34802】Re:IsNumericでエラーがでてしまいます やっちん 06/2/13(月) 13:43 発言[未読]
【34807】Re:IsNumericでエラーがでてしまいます さちきょん 06/2/13(月) 14:54 お礼[未読]

【34775】IsNumericでエラーがでてしまいます
質問  さちきょん  - 06/2/12(日) 10:55 -

引用なし
パスワード
   初心者です。どうぞよろしくお願いいたします。
下のようなルールで、文字数によって
処理をしたいと思います。

半角数字の場合(3文字のみ)
は前から2番目の位置にドット
aaa→aa.a
bbb→bb.b
ccc→cc.c

全角アルファベット(2文字まで)
はそのまま
S→S
K→K
LO→LO


以前教えていただいたコードを自分で変えて
本などをみながら作りましたが、
If IsNumeric(vntData(v, 5)) = True Then のところで、
「インデックスが有効範囲にありません」のエラーがでてしまい、
理由がわかりません。
どこが間違えているのか教えてください。

また、画面更新を再開と停止は必要なのでしょうか?
処理完了のメッセージは出さなくてもよいです。

初歩的な質問ですみません。
どうぞよろしくお願いいたします。


Dim vntData As Variant

Set rngList = S2.Cells(2, 5)
  
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
    'データが無い場合
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'データを配列に取得
    vntData = .Resize(lngRows + 1).Value
  End With
  
  For v = 2 To lngRows
    If IsNumeric(vntData(v, 5)) = True Then
    If Len(vntData(v, 5)) = 3 Then
        vntData(v, 5) = Left(vntData(v, 5), 2) & "." & Right(vntData(v, 5), 1)
      End If
    End If
  Next v

  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  With rngList.Offset(, 1).Resize(lngRows)
    .NumberFormatLocal = "@"
    .Value = vntData
  End With
  
  strProm = "処理が完了しました"
  
Wayout:
  
  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  
  MsgBox strProm, vbInformation


  ・・・・・・
  

【34777】Re:IsNumericでエラーがでてしまいます
発言  やっちん  - 06/2/12(日) 11:14 -

引用なし
パスワード
   ▼さちきょん さん:
>If IsNumeric(vntData(v, 5)) = True Then のところで、
>「インデックスが有効範囲にありません」のエラーがでてしまい、
>理由がわかりません。
こんにちは。
vntData(v, 5)は
vntData(v, 1)では?
vntDataには1列分しか格納してないようですが。

【34778】Re:IsNumericでエラーがでてしまいます
発言  かみちゃん  - 06/2/12(日) 11:16 -

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

>以前教えていただいたコードを自分で変えて

どこで教えていただいたコードなのでしょうか?
コードを見る限り、ここの常連さんがよく提示されるコードに非常によく似ていますので、なんとなくわかるのですが。

>If IsNumeric(vntData(v, 5)) = True Then のところで、
>「インデックスが有効範囲にありません」のエラーがでてしまい、
>理由がわかりません。

vntData(v, 5)
がなんとなくおかしい感じがします。
Set rngList = S2.Cells(2, 5)
としているならば、S2が何を示しているかわかりませんが、
vntData(v, 1)
で十分ではないかと思います。

>また、画面更新を再開と停止は必要なのでしょうか?

なくてもいいと思います。
画面がチラチラする程度です。

>処理完了のメッセージは出さなくてもよいです。

それは、あったほうがいいかと思います。

【34779】Re:IsNumericでエラーがでてしまいます
回答  Hirofumi  - 06/2/12(日) 11:39 -

引用なし
パスワード
   >以前教えていただいたコードを自分で変えて
>本などをみながら作りましたが、
>If IsNumeric(vntData(v, 5)) = True Then のところで、
>「インデックスが有効範囲にありません」のエラーがでてしまい、
>理由がわかりません。
>どこが間違えているのか教えてください。

配列に1列しか取得していないのに、5列目(配列に無い列)を見ているから
当然、インデクスエラーが出るでしょう

>
>また、画面更新を再開と停止は必要なのでしょうか?

必須では有りませんので、削除してもOK

>処理完了のメッセージは出さなくてもよいです。

各「strProm = "・・・"」と「MsgBox strProm, vbInformation」を削除すれば善いのでは

後、何故、「For v = 2 To lngRows」が2から始まっているのですか?

Public Sub Sample()

  Dim vntData As Variant

  Set rngList = S2.Cells(2, 5)
 
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
    'データが無い場合
    If lngRows <= 1 And .Value = "" Then
      GoTo Wayout
    End If
    'データを配列に取得
    vntData = .Resize(lngRows + 1).Value
  End With
 
'  For v = 2 To lngRows
    For v = 1 To lngRows
'      If IsNumeric(vntData(v, 5)) = True Then
      If IsNumeric(vntData(v, 1)) = True Then
'        If Len(vntData(v, 5)) = 3 Then
        If Len(vntData(v, 1)) = 3 Then
'          vntData(v, 5) = Left(vntData(v, 5), 2) _
'                    & "." & Right(vntData(v, 5), 1)
          vntData(v, 1) = Left(vntData(v, 1), 2) _
                    & "." & Right(vntData(v, 1), 1)
        End If
      End If
    Next v

  With rngList.Offset(, 1).Resize(lngRows)
    .NumberFormatLocal = "@"
    .Value = vntData
  End With
 
Wayout:
   
  Set rngList = Nothing
 
End Sub

【34798】Re:IsNumericでエラーがでてしまいます
発言  さちきょん  - 06/2/13(月) 12:48 -

引用なし
パスワード
   やっちんさん、かみちゃんさん、 Hirofumi さん
ご回答ありがとうございました。

コードは、自分でできるところは自分で考えようと思い
ネットや本で調べながら拾い拾いつなげて考えました。
なので、とても混乱してしまっています。
難しいところは、ただ関数を貼り付けただけのコードに
変えてみました。
お恥ずかしいのですが、いちおうすべてのコードは
下のようになっています。

>
>配列に1列しか取得していないのに、5列目(配列に無い列)を見ているから
>当然、インデクスエラーが出るでしょう

Set rngList = S2.Cells(2, 5)

S2というのはsheet2です。
sheet1からsheet2へ値をコピーするというコードがあるからです。

「sheet2のCells(2, 5)の値が整数3ケタだったら前から2番目にドット」
としたかったのですが、

If IsNumeric(vntData(v, 1)) = True Thenを
If IsNumeric(vntData(v, 5)) = True Thenとすれば
Cells(2, 5)の式が、vが2から最終行まで繰り返しできると
思ってしまいました。

>後、何故、「For v = 2 To lngRows」が2から始まっているのですか?

v = 1 は見出しとなっていてデータが入っていないからです。

どうぞよろしくお願いいたします。


Dim S1 As Worksheet, S2 As Worksheet
  Dim WSh As Worksheet
  Dim v As Long
  Dim i As Integer
  Dim lngEndROW As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim strProm As String

  
  Set S1 = Worksheets("Sheet1")
  Set S2 = Worksheets("Sheet2")
  
  
  S2.Columns("B:C").Value = S1.Columns("B:C").Value
  S2.Columns("E:E").Value = S1.Columns("D:D").Value
  S2.Columns("F:F").Value = S1.Columns("Q:Q").Value

  '最終行取得
  lngEndROW = Range("B65536").End(xlUp).Row

   i = lngEndROW
 
  'BC列連結
  With S2.Range("D2:D" & i)
  .Formula = "=CONCATENATE(C[-2],""/"",C[-1])"
  .Value = .Value
  
  End With
  
  'D列置換
  S2.Range("D2:D" & i).Replace what:="/_", replacement:=" ", lookat:=xlPart, MatchCase:=False
  
  
  'サイズ別表示
  Set rngList = S2.Cells(2, 5)
  
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
    'データが無い場合
    If lngRows <= 1 And .Value = "" Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'データを配列に取得
    vntData = .Resize(lngRows + 1).Value
  End With
  
  For v = 1 To lngRows
    If IsNumeric(vntData(v, 1)) Then
      If Len(vntData(v, 1)) = 3 Then
        vntData(v, 1) = Left(vntData(v, 1), 2) & "." & Right(vntData(v, 1), 1)
      End If
    End If
  Next v

  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  With rngList.Offset(, 1).Resize(lngRows)
    .NumberFormatLocal = "@"
    .Value = vntData
  End With
  
  strProm = "処理が完了しました"
  
Wayout:
  
  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  
  MsgBox strProm, vbInformation


  'G列在庫数ルール
  
  With S2.Range("G2:G" & i)
  .Formula = "=IF(F2<2,0,IF(F2<6,1,IF(F2<10,2,99)))"
  .Value = .Value
   
  End With


 With Range("H2:H" & Range("B65536").End(xlUp).Row)
  .Formula = _
  "=IF(D2<>D3,""mark"","""")&IF(D1=D2,H1&"","","""")&E2&""/""&LOOKUP(G2,{0,2,6,10},{""00"",""01"",""02"",""99""})"
  .Value = .Value

  Range("H:H").AutoFilter field:=1, Criteria1:="<>mark*"
  .SpecialCells(xlCellTypeVisible).ClearContents
  ActiveSheet.AutoFilterMode = False
  .Replace what:="mark", replacement:="", lookat:=xlPart
  
 End With

  
End Sub

【34799】Re:IsNumericでエラーがでてしまいます
発言  やっちん  - 06/2/13(月) 13:00 -

引用なし
パスワード
   ▼さちきょん さん:
こんにちは。
コードの内容は見ていませんが、
まだ何か問題があるのでしょうか?

【34801】Re:IsNumericでエラーがでてしまいます
発言  さちきょん  - 06/2/13(月) 13:23 -

引用なし
パスワード
   ▼やっちん さん:
>▼さちきょん さん:
>こんにちは。
>コードの内容は見ていませんが、
>まだ何か問題があるのでしょうか?

▼やっちん さんへ

質問がわかりずらくてすみません。
Hirofumi さんにしたのように直していただいたのですが、
S2.Cells(2, 5)を選択し、その後E列の最後行まで同じ処理を
(sheet2)
したいのですが、(vntData(v, 1))でいいのですか?
ここのところがよくわかりません。
よろしくお願いいたします。


Set rngList = S2.Cells(2, 5)
 
  With rngList
    'データ行数を取得
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1
    'データが無い場合
    If lngRows <= 1 And .Value = "" Then
      GoTo Wayout
    End If
    'データを配列に取得
    vntData = .Resize(lngRows + 1).Value
  End With
 
'  For v = 2 To lngRows
    For v = 1 To lngRows
'      If IsNumeric(vntData(v, 5)) = True Then
      If IsNumeric(vntData(v, 1)) = True Then
'        If Len(vntData(v, 5)) = 3 Then
        If Len(vntData(v, 1)) = 3 Then
'          vntData(v, 5) = Left(vntData(v, 5), 2) _
'                    & "." & Right(vntData(v, 5), 1)
          vntData(v, 1) = Left(vntData(v, 1), 2) _
                    & "." & Right(vntData(v, 1), 1)
        End If
      End If
    Next v

【34802】Re:IsNumericでエラーがでてしまいます
発言  やっちん  - 06/2/13(月) 13:43 -

引用なし
パスワード
   ▼さちきょん さん:
>S2.Cells(2, 5)を選択し、その後E列の最後行まで同じ処理を
>(sheet2)
>したいのですが、(vntData(v, 1))でいいのですか?
>ここのところがよくわかりません。
>よろしくお願いいたします。
こんにちは。
E列のみ処理をしたいということであれば
vntData(v, 1)で大丈夫ですよ。

格納する時点で
    vntData = .Resize(lngRows + 1).Value
これは書き換えると
 = S2.Cells(2, 5).Resize(lngRows + 1).Value
 = Sheets("Sheet2").Range("E2").Resize(lngRows + 1).Value
lngRowsが例えば10だとすると
 = Sheets("Sheet2").Range("E2").Resize(11).Value
 = Sheets("Sheet2").Range("E2:E12").Value
E列だけがvntDataに格納されています。
vntData(行,列)でvntDataの内容が参照できますが
vntDataには1列分(E列)しか格納されていないので
vntData(v, 1)と列は1にする必要があります。

【34807】Re:IsNumericでエラーがでてしまいます
お礼  さちきょん  - 06/2/13(月) 14:54 -

引用なし
パスワード
   ▼やっちん さん:

書き換えていただいた内容でとてもよく理解できました。
お忙しいところ何度もすみません。
どうもありがとうございました!


>▼さちきょん さん:
>>S2.Cells(2, 5)を選択し、その後E列の最後行まで同じ処理を
>>(sheet2)
>>したいのですが、(vntData(v, 1))でいいのですか?
>>ここのところがよくわかりません。
>>よろしくお願いいたします。
>こんにちは。
>E列のみ処理をしたいということであれば
>vntData(v, 1)で大丈夫ですよ。
>
>格納する時点で
>    vntData = .Resize(lngRows + 1).Value
>これは書き換えると
> = S2.Cells(2, 5).Resize(lngRows + 1).Value
> = Sheets("Sheet2").Range("E2").Resize(lngRows + 1).Value
> lngRowsが例えば10だとすると
> = Sheets("Sheet2").Range("E2").Resize(11).Value
> = Sheets("Sheet2").Range("E2:E12").Value
> E列だけがvntDataに格納されています。
> vntData(行,列)でvntDataの内容が参照できますが
> vntDataには1列分(E列)しか格納されていないので
> vntData(v, 1)と列は1にする必要があります。

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