3

列Aに「5670&&2」、「1281 &&-3&-5&&7」などの値の範囲を含むシートがあります。

次の方法でVBAの出力を抽出するのを手伝ってください。

たとえば、5670 && 2の場合、A1セルには5670が含まれ、B1セルには&&、C1セルには2が含まれる必要があります。

たとえば、1281 &&-3&-5 && 7の場合、A1セルには1281、B1セルには&&-、C1セルには3、D1セルには&-、E1セルには5、F1セルには&&、G1セルには7が含まれている必要があります。

plsは同じで役立ちます。

ありがとう。、

4

3 に答える 3

1

Here is one more code. As a side product, function TextSplitToNumbersAndOther can be used independently as a formula to achieve the same effect.

To prevent accidental firing of the macro in a wrong sheet or a wrong column and overwriting neighbouring columns with scrap, named range "Start_point" should be defined by a user. Below this range in the same column, all data will be processed till the first blank row.

Spreadsheet example: http://www.bumpclub.ee/~jyri_r/Excel/Extracting_symbols_into_columns.xls

Option Explicit

Sub ExtractSymbolsIntoColumns()

Dim rng As Range
Dim row_processed As Integer
Dim string_to_split As String
Dim columns_needed As Long
Dim counter As Long

row_processed = 1
 counter = 0
  Set rng = Range("Start_point")
    While rng.Offset(row_processed, 0).Value <> ""
      string_to_split = rng.Offset(row_processed, 0).Value
         columns_needed = TextSplitToNumbersAndOther(string_to_split)
          For counter = 1 To columns_needed
            rng.Offset(row_processed, counter).Value = _
              TextSplitToNumbersAndOther(string_to_split, counter)
          Next
         row_processed = row_processed + 1
      Wend
End Sub

Function TextSplitToNumbersAndOther(InputText As String, _
    Optional SplitPieceNumber As Long) As Variant

Dim piece_from_split(100)  As Variant
Dim char_from_input As String
Dim word_count As Long
Dim counter As Long
Dim char_type(100) As Variant

 InputText = Trim(InputText)

   If Not IsNull(InputText) Then
     word_count = 1
      piece_from_split(word_count) = ""
       For counter = 1 To Len(InputText)
         char_from_input = CharFromTextPosition(InputText, counter)
          char_type(counter) = CharTypeAsNumber(char_from_input)
            If counter = 1 Then
              piece_from_split(word_count) = char_from_input
            Else
              If (char_type(counter - 1) = char_type(counter)) Then
                 piece_from_split(word_count) = piece_from_split(word_count) & char_from_input
                   'Merge for the same type
              Else
                 word_count = word_count + 1
                   piece_from_split(word_count) = char_from_input


              End If
            End If
       Next
   End If

  If SplitPieceNumber = 0 Then
    TextSplitToNumbersAndOther = word_count
  Else
      If SplitPieceNumber > word_count Then
         TextSplitToNumbersAndOther = ""
      Else
        TextSplitToNumbersAndOther = piece_from_split(SplitPieceNumber)
      End If
  End If

End Function

Function CharTypeAsNumber(InputChar As String, Optional PositionInString As Long) As Long

   If PositionInString = 0 Then PositionInString = 1

     If Not IsNull(InputChar) Then
       InputChar = Mid(InputChar, PositionInString, 1)
        Select Case InputChar
          Case 0 To 9
            CharTypeAsNumber = 1
          Case "a" To "z"
            CharTypeAsNumber = 2
          Case "A" To "Z"
            CharTypeAsNumber = 3
          Case Else
            CharTypeAsNumber = 4
         End Select
     Else
           CharTypeAsNumber = 0

     End If

End Function
Function CharFromTextPosition(InputString As String, TextPosition As Long) As String

   CharFromTextPosition = Mid(InputString, TextPosition, 1)

End Function
于 2012-11-01T11:17:23.173 に答える
1

ここでは、数値を非数値から分離するコードを記述しようとしました。数値と非数値は、Excel の Text-To-Columns などの別の列にコピーされます。コードは少しクレイジーです。必要に応じてコメントを提供します。入力として ActiveSheet.UsedRange.Columns(1).Cells が使用されます。

Option Explicit

Sub SeparateNumbers()
  Dim targetRange As Range
  Dim cellRange As Range
  Dim charIndex As Integer
  Dim oneChar As String
  Dim nextChar As String
  Dim start As Integer
  Dim copiedCharsCount As Integer
  Dim cellValue As String
  Dim columnIndex As Integer

  Set targetRange = ActiveSheet.UsedRange.Columns(1).Cells

  For Each cellRange In targetRange
    columnIndex = cellRange.Column
    start = 1
    copiedCharsCount = 0
    cellValue = cellRange.Value
    If (VBA.Strings.Len(cellValue) <= 1) Then GoTo nextCell

    For charIndex = 2 To Len(cellValue)
      oneChar = VBA.Strings.Mid(cellValue, charIndex - 1, 1)
      nextChar = VBA.Strings.Mid(cellValue, charIndex, 1)
      If VBA.IsNumeric(oneChar) And VBA.IsNumeric(nextChar) Then GoTo nextCharLabel
      If Not VBA.IsNumeric(oneChar) And Not VBA.IsNumeric(nextChar) Then GoTo nextCharLabel

      cellRange.Offset(0, columnIndex).Value = VBA.Strings.Mid(cellValue, start, charIndex - start)
      columnIndex = columnIndex + 1
      copiedCharsCount = copiedCharsCount + (charIndex - start)
      start = charIndex

nextCharLabel:
      If charIndex = Len(cellValue) Then
        cellRange.Offset(0, columnIndex).Value = VBA.Strings.Right(cellValue, charIndex - copiedCharsCount)
      End If
    Next charIndex

nextCell:
  Next cellRange
End Sub
于 2012-11-01T09:56:40.103 に答える
0

目的を達成するために、UDF (ユーザー定義関数) を作成できます。あなたの2つの例は、Excelの隣接する列(A、B、C、D ...)にフィルターをかける順序(昇順)です。

では、文字列を隣接していない列に分割する必要があるシナリオは決してないと論理的に仮定するのは正しいでしょうか? たとえば、1234 は A に、&& は C に、3 は D に、...結果として A、C、D になります。

前提 2: 分割された文字列は、Excel が提供できる以上の列を必要としないこと。

試すことができる手順: 1. 文字列が空でないことを確認します。 2. 数字以外の文字で分割します。 3. 数字以外の各文字の最初と最後で、次の隣接する列に進むことができます。

検索ヘルプ: Excel で文字列を複数の列に分割する - VBA

于 2012-11-01T09:17:26.200 に答える