- 締切済み
エクセル VBA
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは こんな感じでも、 Sub test() Dim r As Range Dim t As Range Application.ScreenUpdating = False With Range("A1", Range("A" & Rows.Count).End(xlUp).Offset(-2)) .Offset(, 6).Resize(, 4).ClearContents .Copy Range("G1") End With Set t = Range("G1", Range("G" & Rows.Count).End(xlUp)) t.TextToColumns Destination:=Range("G1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _ "個", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _ TrailingMinusNumbers:=True Columns("H:H").Insert Shift:=xlToRight Set t = Range("G1", Range("G" & Rows.Count).End(xlUp)) With t.Offset(, 1) .Formula = "=J1/I1" .Value = .Value End With For Each r In t r.Replace r.Offset(, 1), "" r.Offset(, 1) = r.Offset(, 1) & "個" Next Application.ScreenUpdating = True End Sub F8キーでステップ実行すれば何をやっているか分かります。 手作業をマクロにしただけみたいなものです。
- Prome_Lin
- ベストアンサー率42% (201/470)
「○○15個650 9,750」ですが、商品名に半角の数字を含まない、という前提条件で、以下のマクロを組みました。 もし、「商品名」に半角の数字を含む可能性のある場合は、おっしゃってください、「商品名」のデータベースから読み込んで、処理をする方法を考えますが、その際は、そのデータベースが具体的にどうなっているのか、教えてください(「A」列の何行目から「商品名」の一覧が入っている、など)。 Option Explicit Sub Test() Dim c, i, j, o, p As Long Dim n, m, q, r, s As String For i = 1 To Range("A1").End(xlDown).Row s = Cells(i, 1).Value c = 0 For j = 1 To Len(s) If Mid(s, j, 1) >= "0" And Mid(s, j, 1) <= "9" Then c = 1 n = Left(s, j - 1) p = InStr(s, "個") m = Mid(s, j, p - j + 1) o = InStr(s, " ") q = Mid(s, p + 1, o - p - 1) r = Mid(s, o + 1) End If If c = 1 Then Exit For End If Next j Cells(i, 7).Value = n Cells(i, 8).Value = m Cells(i, 9).Value = q Cells(i, 10).Value = r Next i End Sub 簡単な説明です。 For i = 1 To Range("A1").End(xlDown).Row 「A」列の一番最後まで処理を行います(途中、空白セルがあった場合、その手前の行が、最終行と判断してしまいます)。 s = Cells(i, 1).Value それぞれの行の「A」列の値(文字)を「s」に代入しています。 For j = 1 To Len(s) 文字列「s」の文字数の分だけ処理を行います。 If Mid(s, j, 1) >= "0" And Mid(s, j, 1) <= "9" Then 1文字ずつ調べて、その1文字が「0」から「9」の間であれば、 n = Left(s, j - 1) 商品名を取得。 p = InStr(s, "個") 「個」という文字が、何文字目にあるか調べています。 m = Mid(s, j, p - j + 1) 個数の取得。 o = InStr(s, " ") 半角スペースが、何文字目か調べています。 q = Mid(s, p + 1, o - p - 1) 単価を取得。 r = Mid(s, o + 1) 合計金額を取得。 Cells(i, 7).Value = n Cells(i, 8).Value = m Cells(i, 9).Value = q Cells(i, 10).Value = r それぞれの値を、それぞれのセルに書き込んでいます。
補足
早速のご回答有難うございます。 まず商品名の後にスペースなしで個数が入ってくるかどうか。ですが、これはスペースがあったり、無かったりします。そこの規則性はわかりません。ただ、~個の「~」と「個」の間には必ず半角スペースがあります。 つまりパターン(1)「○○15 個 300 45000」 パターン(2)「○○ 15 個 300 45000」 と、このように○○の後に半角スペースが入る入らないはあります。また、スペースは全て半角で入っています。 商品名のデータは別のシート(シート2と仮定)の1セルに1つずつ入っています。この商品名がシート2に約1000個あります。 まとめますと ・スペースは全て半角 ・商品名の後のスペースはあったりなかったり ・個数には必ず「~ 個」と数字と文字の間にスペースがある ・商品名はエクセルで一個ずつコピペ可能な状態 ・単価と合計金額の間にも必ずスペースがある です。色々言葉足らずで済みません。
補足
もうしわけありません。 エラーが出まして先に進めませんでした。