ExcelワークシートでSPLIT関数を使う

## やりたいこと
「,」などの区切り文字を指定して、文字列を簡単に分割するユーザー定義関数を作ります。
Excel VBAではSplit関数を使えますが、Excelシートでは使えません。
具体的には、Googleスプレッドシートのように使えると便利そうです。
https://dekiru.net/article/18395/

## 縦方向と横方向の分割
さらに、横方向にも縦方向にも分割できるように2つの関数を作ります。
横方向に分割するhSeparate関数と、縦方向に分割するvSeparate関数として、
以下のように作成します。


```vb:module1.bas
Public Function hSeparate(ByRef str As String, ByRef sep As String) As Variant
    Dim v As Variant
    v = Split(str, sep)
    hSeparate = v
End Function

Public Function vSeparate(ByRef str As String, ByRef sep As String) As Variant
    Dim v As Variant
    v = Split(str, sep)
    vSeparate = WorksheetFunction.Transpose(v)
End Function
```

### 横方向分割の使い方
まずは、横方向に分割するhSeparate関数から説明します。
以下のような分割前の文字列に対して使用します。
![190928_Pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/e011b9cc-3d88-94cc-b82b-9f1172af5672.png)

戻り値は配列関数になります。
このため、まずは、戻り値の配列を想定した範囲を、選択してから、数式を入力します。


**hSeparate("テキスト", "区切り文字")**



そして、確定するときにShift+Control+Enterで確定させます。
![190928_Pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/c45d42a4-fa0f-b1f3-c4ee-feb880442ed7.png)

","で分割できました。
![190928_Pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/bb2198ff-e037-ea71-8e2b-eb8fe19b2f65.png)

### 縦方向に分割の使い方
戻り値の配列を想定した範囲を、選択してから、数式を入力します。


**vSeparate("テキスト", "区切り文字")**


縦方向に、範囲を選択して、Shift+Control+Enterで確定させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/71a7b118-8110-8dc9-2a45-3166747e5fe3.png)

", "で分割できました。
分割文字を","と" "を組み合わせた2文字にしているので、価格は分割されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/ea1b7d60-435a-4fb2-1978-1902a5d49efe.png)

##GASと同じオプションを付ける場合
GAS(Google Apps Script)のように、以下のようなオプションをつけても使い勝手が良さそうです。
**SPLIT（テキスト, 区切り文字, 各文字での分割, 空のテキストを削除）**

具体的には、以下のような関数にします。

```vb:module2.bas
Public Function gSeparate(str As String, sep As String, bEachSep As Boolean, bEraseBrank As Boolean) As Variant
    Dim v As Variant
    Dim eSep As String, bSep As String
    Dim i As Integer
    
    '指定された複数の区切り文字を1種類に統一
    bSep = Left(sep, 1)
    If bEachSep = True Then
        For i = 1 To Len(sep)
            eSep = Mid(sep, i, 1)
            str = Replace(str, eSep, bSep)
        Next
    End If
    
    '文字列を分割
    v = Split(str, bSep)


    '空白を削除
    Dim v_ans As Variant
    ReDim v_ans(LBound(v) To UBound(v))
    Dim cnt As Integer
    cnt = LBound(v)
    If bEraseBrank = True Then
        For i = LBound(v) To UBound(v)
            v(i) = Replace(v(i), " ", "")
            v(i) = Replace(v(i), "　", "")
            If v(i) <> "" Then
                v_ans(cnt) = v(i)
                cnt = cnt + 1
            End If
        Next
        ReDim Preserve v_ans(LBound(v) To cnt - 1)
    End If

    
    If bEraseBrank = True Then
        gSeparate = v_ans
    Else
        gSeparate = v
    End If
    
End Function
```

### GASオプション付きの使い方
####例1:
戻り値の配列を想定した範囲を、選択してから、以下の数式を入力します。

**gSeparate("テキスト", "区切り文字", 各文字での分割, 空のテキストを削除)**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/a6801dee-fc2d-2c20-9813-7fe55f54370f.png)

Shift+Control+Enterで確定させます。
![190928_Pic5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/03c43cc9-81c9-dbfb-1e89-0fcb06758631.png)

####例2:
以下のような、異なる種類の区切り文字で分割する場合もきれいに分割できます
![190928_Pic6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/efd9b5ad-ff38-459b-c38e-72b7fd97fb63.png)

区切り文字 "/" と"(" と")"のところで分割され、空のセルも自動で削除されています。
![190928_Pic7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/7404b7a0-6db5-1ebd-4bfb-7bae15cb6470.png)

####例3:
空白を無視したくないときは、空のテキストを削除 = falseと設定します。
![190928_pic7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/84e25f69-f4d8-7440-b145-2fc9b579ec66.png)

この例だと、麻布と大阪の間に、")"と"/"で区切られている部分が空のテキストとして表示されました。
![190928_pic8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/822d61a9-0aa6-e94b-78ab-0bbc978bdad7.png)