Excel VBA質問箱 IV

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

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


7712 / 13644 ツリー ←次へ | 前へ→

【37282】初心者です。よろしくお願いします。 ぴい 06/4/27(木) 21:21 質問[未読]
【37283】Re:初心者です。よろしくお願いします。 Kein 06/4/27(木) 21:41 回答[未読]
【37284】Re:初心者です。よろしくお願いします。 ぴい 06/4/27(木) 22:09 質問[未読]
【37285】Re:初心者です。よろしくお願いします。 かみちゃん 06/4/27(木) 22:19 発言[未読]
【37286】Re:初心者です。よろしくお願いします。 Kein 06/4/27(木) 22:24 発言[未読]
【37287】Re:初心者です。よろしくお願いします。 ぴい 06/4/27(木) 23:52 質問[未読]
【37297】Re:初心者です。よろしくお願いします。 やっちん 06/4/28(金) 12:49 発言[未読]
【37302】Re:初心者です。よろしくお願いします。 ハト 06/4/28(金) 14:39 発言[未読]
【37324】Re:初心者です。よろしくお願いします。 ぴい 06/4/28(金) 21:09 お礼[未読]

【37282】初心者です。よろしくお願いします。
質問  ぴい  - 06/4/27(木) 21:21 -

引用なし
パスワード
   初心者です。
在庫管理表を作っています。

1行目にはサイズカテゴリが出力されていて、置換したいと思います。


=========================
270のように半角3ケタで出力されているもの→27.0
1920と半角4ケタで出力されているもの→19-20

「総計」、「その他」と書いてある列はまるごと削除
空白セルがあったら次へ進む
=========================

です。

これをすべて繰り返し処理しようと思い、本を見ながら
Select Case〜でやってみたのですが、うまくいかず、
「If〜 End If」を何度か使ったらできるかと思い
苦戦しましたが、エラーでよくわからなくなってしまいました。

初歩的なことだと思うのですが、申し訳ありません。
どなたか教えてください。


Sub 在庫()

  Dim C As Range
  Dim i As Integer
  Dim v As Integer
  Dim Bs As String, St As String
  Dim lngEndROW As Long
  Dim shName
  Dim sizeIndex
  
  
  'ターゲットシート指定
  shName = "アクセサリー"


  'サイズ表示修正
  For v = 5 To 38
  
  Dim test
    test = Worksheets(shName).Cells(1, v)
    If IsNumeric(test) = True Then
    
    If Len(Worksheets(shName).Cells(1, v)) = 4 Then
     Worksheets(shName).Cells(1, v) = Left(Worksheets(shName).Cells      (1, v), 2) & "-" & Right(Worksheets(shName).Cells(1, v), 2)
     Worksheets(shName).Cells(1, v).NumberFormat = "@"
     Worksheets(shName).Cells(1, v).Value = VBA.Trim(Worksheets   (shName).Cells(1, v).Value)
       
    End If
    End If
      
  Next v
     
  If IsNumeric(test) = True Then
  If Len(Worksheets(shName).Cells(1, v)) = 3 Then
   Worksheets(shName).Cells(1, v) = Left(Worksheets(shName).Cells(1,       v), 2) & "." & Right(Worksheets(shName).Cells(1, v), 1)
   Worksheets(shName).Cells(1, v).NumberFormat = "@"
   Worksheets(shName).Cells(1, v).Value = VBA.Trim(Worksheets     (shName).Cells(1, v).Value)
      
      
    End If
    End If
    
  
  Next v

  ・・・・
    
    

【37283】Re:初心者です。よろしくお願いします。
回答  Kein  - 06/4/27(木) 21:41 -

引用なし
パスワード
   そこまでを編集し直すと・・

Sub 在庫()
  Dim C As Range
  Dim i As Integer, v As Integer
  Dim Bs As String, St As String
  Dim lngEndROW As Long
  Dim test As Variant, sizeIndex As Variant
  
  With Worksheets("アクセサリー")
    For v = 38 To 5 Step -1
     test = .Cells(1, v).Value
     If Not IsNumeric(test) Then
       If test = "総計" Or "その他" Then
        .Columns(v).Delete xlShiftToLeft
       End If
     Else
       If Len(test) = 4 Then
        .Cells(1, v).Value = _
        Left(test, 2) & "-" & Right(test, 2)
        .Cells(1, v).Value = VBA.Trim(.Cells(1, v).Value)
       ElseIf Len(test) = 3 Then
        .Cells(1, v).NumberFormat = "@"
        .Cells(1, v).Value = _
        Left(test, 2) & "." & Right(test, 1)
       End If
     End If
    Next v
  End With

【37284】Re:初心者です。よろしくお願いします。
質問  ぴい  - 06/4/27(木) 22:09 -

引用なし
パスワード
   ▼Kein さん:

ありがとうございました。
編集しなおしていただいたもので実行してみましたが、

If test = "総計" Or "その他" Then

のところで、「型が一致しません。(エラー13)」が
でてしまいます。
どこがいけないんでしょうか?
よろしくお願いいたします。


>そこまでを編集し直すと・・
>
>Sub 在庫()
>  Dim C As Range
>  Dim i As Integer, v As Integer
>  Dim Bs As String, St As String
>  Dim lngEndROW As Long
>  Dim test As Variant, sizeIndex As Variant
>  
>  With Worksheets("アクセサリー")
>    For v = 38 To 5 Step -1
>     test = .Cells(1, v).Value
>     If Not IsNumeric(test) Then
>       If test = "総計" Or "その他" Then
>        .Columns(v).Delete xlShiftToLeft
>       End If
>     Else
>       If Len(test) = 4 Then
>        .Cells(1, v).Value = _
>        Left(test, 2) & "-" & Right(test, 2)
>        .Cells(1, v).Value = VBA.Trim(.Cells(1, v).Value)
>       ElseIf Len(test) = 3 Then
>        .Cells(1, v).NumberFormat = "@"
>        .Cells(1, v).Value = _
>        Left(test, 2) & "." & Right(test, 1)
>       End If
>     End If
>    Next v
>  End With

【37285】Re:初心者です。よろしくお願いします。
発言  かみちゃん  - 06/4/27(木) 22:19 -

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

> If test = "総計" Or "その他" Then
>
>のところで、「型が一致しません。(エラー13)」が

If test = "総計" Or test = "その他" Then
ではないかと思います。

【37286】Re:初心者です。よろしくお願いします。
発言  Kein  - 06/4/27(木) 22:24 -

引用なし
パスワード
   あー・・そうです。かみちゃんさんのレスに従って下さい。
かみちゃんさん、フォローをありがとうございます。

【37287】Re:初心者です。よろしくお願いします。
質問  ぴい  - 06/4/27(木) 23:52 -

引用なし
パスワード
   ▼Kein さん、かみちゃんさん:
どうもありがとうございました。

With〜If〜Else〜End Ifの使い方、よくわかりました。
コードを実行すると、違うところでエラーになってしまいました。
こういう場合は、ちがうトピックをたてるのでしょうか。
この場で教えていただければうれしいです。

一応、すべてのコードを書きます。

最後から2行目の Next i で「Nextで指定された変数の参照が不正です」
のエラーがでます。
もともと、前任者が作ったコードを変えたもので、====で囲った
部分は必要ないのですが、(1,v)がアルファベットサイズの行から先が
Range("AM:AM")に抽出できていないため、いちおう書いておきました。
この部分は難しすぎて、よくわかりません。

わかりずらくてすみません。
よろしくお願いします。


Sub 在庫()
  Dim C As Range
  Dim i As Integer, v As Integer
  Dim Bs As String, St As String
  Dim lngEndROW As Long
  Dim test As Variant, sizeIndex As Variant
 
  'ターゲットシート指定
  shName = "アクセサリー"
   
  
  With Worksheets("アクセサリー")
    For v = 38 To 5 Step -1
     test = .Cells(1, v).Value
     If Not IsNumeric(test) Then
       If test = "総計" Or test = "その他" Then
        .Columns(v).Delete xlShiftToLeft
       End If
     Else
       If Len(test) = 4 Then
        .Cells(1, v).Value = _
        Left(test, 2) & "-" & Right(test, 2)
        .Cells(1, v).Value = VBA.Trim(.Cells(1, v).Value)
       ElseIf Len(test) = 3 Then
        .Cells(1, v).NumberFormat = "@"
        .Cells(1, v).Value = _
        Left(test, 2) & "." & Right(test, 1)
       End If
     End If
    Next v
  End With


'置換 (特殊なサイズ)
  Worksheets(shName).Range("E1:AJ1").Replace what:="_", replacement:="", lookat:=xlPart
  Worksheets(shName).Range("E1:AJ1").Replace what:="OSFX", replacement:="OS-FX", lookat:=xlPart
  Worksheets(shName).Range("E1:AJ1").Replace what:="OSFZ", replacement:="OS-FZ", lookat:=xlPart
  
'最終行取得
  lngEndROW = Worksheets(shName).Range("A65536").End(xlUp).Row


  For i = 2 To lngEndROW
  
   If lngEndROW < 2 Then Exit Sub
   
    sizeFlag = False
    Bs = "": St = ""
    For Each C In Worksheets(shName).Cells(i, 5).Resize(, 36)
      Bs = Trim(Worksheets(shName).Cells(1, C.Column).Text)
      
'在庫数による文字列操作
      Select Case C.Value
        Case Is = "": St = St
        Case Is < 2: St = St & Bs & "/00,"
        Case Is < 6: St = St & Bs & "/01,"
        Case Is < 10: St = St & Bs & "/02,"
        Case Else: St = St & Bs & "/99,"
      End Select
 
'==============================================================
'衣服サイズか? (英字のサイズがある場合に並び替えの必要あり)
      If C.Value <> "" And (Bs = "XS" Or Bs = "S" Or Bs = "M" Or Bs = "L" Or Bs = "XL" Or Bs = "O" Or Bs = "XO" Or Bs = "2XO" Or Bs = "OG" Or Bs = "OS-FX" Or Bs = "OS-FZ") Then
        sizeFlag = True
      End If
    Next

'サイズが衣服サイズなら並び替え
    If sizeFlag Then
      Dim dic, spArray, cnt, tmpName, tmpData
      Set dic = CreateObject("Scripting.Dictionary")
      spArray = Split(St, ",")
      For cnt = 0 To (UBound(spArray) - 1)
        tmpName = Mid(spArray(cnt), 1, InStr(spArray(cnt), "/") - 1)
        dic.Add tmpName, spArray(cnt)
      Next
      St = ""
      For cnt = 0 To (UBound(sizeIndex))
        tmpData = dic(sizeIndex(cnt))
        If Not IsNull(tmpData) And tmpData <> "" Then
          St = St & tmpData & ","
        End If
      Next
    End If
'=============================================================

'値の代入
    Worksheets(shName).Range("AM:AM").NumberFormat = "@"
    St = Left$(St, Len(St) - 1)
    Worksheets(shName).Cells(i, 39).Value = Trim(St)
  Next i
  
   
End Sub

【37297】Re:初心者です。よろしくお願いします。
発言  やっちん  - 06/4/28(金) 12:49 -

引用なし
パスワード
   ▼ぴい さん:
こんにちは。
横から失礼します。
これが原因かどうかはわかりませんが
「i」は「Long」で定義した方がいいですよ。

ヘルプより
整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、-32,768 〜 32,767 の範囲の値をとります。
長整数型 (Long) の変数は、32 ビット (4 バイト) の変数です。-2,147,483,648 〜 2,147,483,647 の範囲の値をとります。

【37302】Re:初心者です。よろしくお願いします。
発言  ハト  - 06/4/28(金) 14:39 -

引用なし
パスワード
   こんにちわ

▼ぴい さん:
>▼Kein さん、かみちゃんさん:
>どうもありがとうございました。
>
>一応、すべてのコードを書きます。
>
>最後から2行目の Next i で「Nextで指定された変数の参照が不正です」
>のエラーがでます。

このエラーメッセージは

For i = 0 to 10
Next j

のように、For で指定している変数と Next で指定している変数が異なっている場合に出ます。
ご提示されたコードを見る限りでは間違ってないようにみえますが、もう一度確認してみてください

それと

>      For cnt = 0 To (UBound(sizeIndex))
>        tmpData = dic(sizeIndex(cnt))
>        If Not IsNull(tmpData) And tmpData <> "" Then
>          St = St & tmpData & ","
>        End If
>      Next

この sizeIndex ですが、いきなり出てきているように見えます
どこで配列を格納しているんでしょうか?

やはり、ご提示されたコードに不足があるように見受けられます

【37324】Re:初心者です。よろしくお願いします。
お礼  ぴい  - 06/4/28(金) 21:09 -

引用なし
パスワード
   みなさまありがとうございました!


やっちんさんに教えていただいたDim i As Long に変えて、
下のコードの最後にNextを加えたらきちんと作動しました。


'===============
'在庫数による文字列操作
      Select Case C.Value
        Case Is = "": St = St
        Case Is < 2: St = St & Bs & "/00,"
        Case Is < 6: St = St & Bs & "/01,"
        Case Is < 10: St = St & Bs & "/02,"
        Case Else: St = St & Bs & "/99,"
      End Select
      
     Next                ←ここにNext
'===============

実のところ、Nextは変数と組み合わせて使うものと思って
いましたので、なぜ Next iじゃないのか自分でもよくわかりません(??)

ハトさんご指摘いただいた sizeIndex の格納ですが、
下のコードは必要ないものなので、削除しました。

>      For cnt = 0 To (UBound(sizeIndex))
>        tmpData = dic(sizeIndex(cnt))
>        If Not IsNull(tmpData) And tmpData <> "" Then
>          St = St & tmpData & ","
>        End If
>      Next


下のコードで作動しました。


Sub 在庫()
  Dim C As Range
  Dim i As Long, v As Integer
  Dim Bs As String, St As String
  Dim lngEndROW As Long
  Dim test As Variant, sizeIndex As Variant
  
  'ターゲットシート指定
  shName = "アクセサリー"
   
  'サイズ表記の操作
  With Worksheets("アクセサリー")
    For v = 38 To 5 Step -1
     test = .Cells(1, v).Value
     If Not IsNumeric(test) Then
       If test = "総計" Or test = "(空白)" Then
        .Columns(v).Delete xlShiftToLeft
       End If
     Else
       If Len(test) = 4 Then
        .Cells(1, v).Value = _
        Left(test, 2) & "-" & Right(test, 2)
        .Cells(1, v).Value = VBA.Trim(.Cells(1, v).Value)
       ElseIf Len(test) = 3 Then
        .Cells(1, v).NumberFormat = "@"
        .Cells(1, v).Value = _
        Left(test, 2) & "." & Right(test, 1)
       End If
     End If
    Next v
  End With


 '特殊サイズの置換・修正
  Worksheets(shName).Range("E1:AJ1").Replace what:="_", replacement:="", lookat:=xlPart
  Worksheets(shName).Range("E1:AJ1").Replace what:="OSFX", replacement:="OS-FX", lookat:=xlPart
  Worksheets(shName).Range("E1:AJ1").Replace what:="OSFZ", replacement:="OS-FZ", lookat:=xlPart
  
  '最終行取得
  lngEndROW = Worksheets(shName).Range("A65536").End(xlUp).Row


  For i = 2 To lngEndROW
  
   If lngEndROW < 2 Then Exit Sub
   
   
    Bs = "": St = ""
    For Each C In Worksheets(shName).Cells(i, 5).Resize(, 36)
      Bs = Trim(Worksheets(shName).Cells(1, C.Column).Text)
      
      '在庫数による文字列操作
      Select Case C.Value
        Case Is = "": St = St
        Case Is < 2: St = St & Bs & "/00,"
        Case Is < 6: St = St & Bs & "/01,"
        Case Is < 10: St = St & Bs & "/02,"
        Case Else: St = St & Bs & "/99,"
      End Select
      
     Next
  
    'AM列にサイズ値の代入
    Worksheets(shName).Range("AM:AM").NumberFormat = "@"
    St = Left$(St, Len(St) - 1)
    Worksheets(shName).Cells(i, 39).Value = Trim(St)
  Next i
  
   
End Sub


  

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