Excel VBA質問箱 IV

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

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


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

【77477】数値がプラスマイナスのとき、データ増やす みか 15/10/15(木) 19:42 質問[未読]
【77478】Re:数値がプラスマイナスのとき、データ増... β 15/10/15(木) 20:13 発言[未読]
【77485】Re:数値がプラスマイナスのとき、データ増... みか 15/10/16(金) 8:47 質問[未読]
【77486】Re:数値がプラスマイナスのとき、データ増... みか 15/10/16(金) 12:40 お礼[未読]
【77489】Re:数値がプラスマイナスのとき、データ増... β 15/10/16(金) 14:00 発言[未読]
【77493】Re:数値がプラスマイナスのとき、データ増... みか 15/10/16(金) 16:10 お礼[未読]

【77477】数値がプラスマイナスのとき、データ増や...
質問  みか  - 15/10/15(木) 19:42 -

引用なし
パスワード
   みなさん、こんばんは。
vba初心者のため、上手く伝わるか分かりませんが、よろしくお願いします。

セルのデータが±で始まる時、データをプラスとマイナスに分けたデータに作りかえたいのです。

例1
  X  Y  Z
  ±50  ±40 ±5

の時、下記データに変換したいのです。

   X   Y  Z
   50   40   5
   50   40  -5
   50  -40   5
   50  -40  -5
  -50   40   5
  -50   40  -5
  -50  -40   5
  -50  -40  -5

例2
   X   Y   Z
   50  ±40  5

の時は下記のように、

   X   Y  Z
   50   40   5
   50  -40   5

loopでまわしてみたのですが、上手く行きませんでした。
参考程度でもよいのでヒントを下さい。
よろしくお願いします。

【77478】Re:数値がプラスマイナスのとき、データ...
発言  β  - 15/10/15(木) 20:13 -

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

もう少しコードを整理して、ループによるコード圧縮もできますがとりあえず。

Sub Test()
  Dim wX As Variant
  Dim wY As Variant
  Dim wZ As Variant
  Dim dX As Variant
  Dim dY As Variant
  Dim dZ As Variant
  Dim v As Variant
  Dim n As Variant
  Dim x As Long
  
  ReDim v(1 To 2 * 2 * 2, 1 To 3)
  
  n = Range("X1").Value
  If Left(n, 1) = "±" Then
    ReDim wX(1 To 2)
    wX(1) = Mid(n, 2)
    wX(2) = Mid(n, 2) * -1
  Else
    ReDim wX(1 To 1)
    wX(1) = n
  End If
  
  n = Range("Y1").Value
  If Left(n, 1) = "±" Then
    ReDim wY(1 To 2)
    wY(1) = Mid(n, 2)
    wY(2) = Mid(n, 2) * -1
  Else
    ReDim wY(1 To 1)
    wY(1) = n
  End If
  
  n = Range("Z1").Value
  If Left(n, 1) = "±" Then
    ReDim wZ(1 To 2)
    wZ(1) = Mid(n, 2)
    wZ(2) = Mid(n, 2) * -1
  Else
    ReDim wZ(1 To 1)
    wZ(1) = n
  End If
  
  For Each dX In wX
    For Each dY In wY
      For Each dZ In wZ
        x = x + 1
        v(x, 1) = dX
        v(x, 2) = dY
        v(x, 3) = dZ
      Next
    Next
  Next
  
  Range("X1").Resize(UBound(v, 1), 3).Value = v
  
End Sub

【77485】Re:数値がプラスマイナスのとき、データ...
質問  みか  - 15/10/16(金) 8:47 -

引用なし
パスワード
   βさん回答ありがとうございます。
説明不足ですみません。

データが複数ある場合は、更にループをすれば良いのでしょうか?

例えば

  X  Y  Z
   ±50  ±40 ±5
    50  ±40  5
   ±30  20   6

の時、下記データに変換したいのです。

   X   Y  Z
   50   40   5
   50   40  -5
   50  -40   5
   50  -40  -5
  -50   40   5
  -50   40  -5
  -50  -40   5
  -50  -40  -5 
   50   40   5
   50  -40   5
   30   20   6
   -30   20   6

以上のようにしたいのですが、アドバイス頂けるとありがたいです。
よろしくお願いします。

【77486】Re:数値がプラスマイナスのとき、データ...
お礼  みか  - 15/10/16(金) 12:40 -

引用なし
パスワード
   βさん回答ありがとうございました。
自分なりにループして作成できました。
本当に助かりました。
今後も日々勉強します。
ありがとうございました。

【77489】Re:数値がプラスマイナスのとき、データ...
発言  β  - 15/10/16(金) 14:00 -

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

それはよかったです。

一応書きましたので参考まで。

Sub Test2()
  Dim v As Variant
  Dim x As Long
  Dim y As Long
  Dim r As Range
  
  With Range("X1", Range("X" & Rows.Count).End(xlUp)).Resize(, 3)
    ReDim v(1 To .Rows.Count)
    For Each r In .Rows
      x = x + 1
      v(x) = getDim(r)
    Next
  End With
  
  Columns("X:Z").ClearContents
  y = 1
  
  For x = 1 To UBound(v)
    Cells(y, "X").Resize(UBound(v(x), 1), 3).Value = v(x)
    y = Range("X" & Rows.Count).End(xlUp).Row + 1
  Next
  
End Sub

Private Function getDim(r As Range) As Variant
  Dim wX As Variant
  Dim wY As Variant
  Dim wZ As Variant
  Dim dX As Variant
  Dim dY As Variant
  Dim dZ As Variant
  Dim v As Variant
  Dim n As Variant
  Dim x As Long
 
  ReDim v(1 To 2 * 2 * 2, 1 To 3)
  
  n = r.Cells(1, 1).Value
  If Left(n, 1) = "±" Then
    ReDim wX(1 To 2)
    wX(1) = Mid(n, 2)
    wX(2) = Mid(n, 2) * -1
  Else
    ReDim wX(1 To 1)
    wX(1) = n
  End If
 
  n = r.Cells(1, 2).Value
  If Left(n, 1) = "±" Then
    ReDim wY(1 To 2)
    wY(1) = Mid(n, 2)
    wY(2) = Mid(n, 2) * -1
  Else
    ReDim wY(1 To 1)
    wY(1) = n
  End If
 
  n = r.Cells(1, 3).Value
  If Left(n, 1) = "±" Then
    ReDim wZ(1 To 2)
    wZ(1) = Mid(n, 2)
    wZ(2) = Mid(n, 2) * -1
  Else
    ReDim wZ(1 To 1)
    wZ(1) = n
  End If
 
  For Each dX In wX
    For Each dY In wY
      For Each dZ In wZ
        x = x + 1
        v(x, 1) = dX
        v(x, 2) = dY
        v(x, 3) = dZ
      Next
    Next
  Next
 
  getDim = v
 
End Function

【77493】Re:数値がプラスマイナスのとき、データ...
お礼  みか  - 15/10/16(金) 16:10 -

引用なし
パスワード
   β さん、たびたびありがとうございます。
分かりやすく、纏まった構文ですね。
私が作ったものとは大違い、、、

いつかβさんのようなプログラムが作れるように頑張ります。
本当にありがとうございました。

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