Excel VBA質問箱 IV

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

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


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

【32570】文字の選別 俊之 05/12/18(日) 14:25 質問[未読]
【32571】Re:文字の選別 かみちゃん 05/12/18(日) 14:37 発言[未読]
【32572】Re:文字の選別 俊之 05/12/18(日) 14:44 質問[未読]
【32573】Re:文字の選別 かみちゃん 05/12/18(日) 14:53 発言[未読]
【32574】Re:文字の選別 俊之 05/12/18(日) 15:03 質問[未読]
【32575】Re:文字の選別 かみちゃん 05/12/18(日) 15:15 発言[未読]
【32577】Re:文字の選別 俊之 05/12/18(日) 15:30 質問[未読]
【32578】Re:文字の選別 かみちゃん 05/12/18(日) 15:35 発言[未読]
【32591】Re:文字の選別 ichinose 05/12/18(日) 20:16 発言[未読]
【32592】Re:文字の選別 Kein 05/12/18(日) 20:20 回答[未読]
【32600】Re:文字の選別 awu 05/12/19(月) 11:17 回答[未読]
【32607】Re:文字の選別 俊之 05/12/19(月) 14:48 お礼[未読]

【32570】文字の選別
質問  俊之  - 05/12/18(日) 14:25 -

引用なし
パスワード
   こんにちは。質問があります。
例えばA1のセルに、「日本2005」と入れたものを
B1には日本
C1には2005
と分けて表示させるような関数などがあったら教えていただきたいので
よろしくお願いいたします

【32571】Re:文字の選別
発言  かみちゃん  - 05/12/18(日) 14:37 -

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

>例えばA1のセルに、「日本2005」と入れたものを
>B1には日本
>C1には2005
>と分けて表示させるような関数

規則性がよくわかりません。
B1 → Mid(A1,1,2)
C1 → Replace(Mid(A1,1,2),"")
でしょうか。
規則性(後ろ4文字は数字とか)を説明していただけるともう少し具体的なお答え
が書けるかもしれません。

【32572】Re:文字の選別
質問  俊之  - 05/12/18(日) 14:44 -

引用なし
パスワード
   かみちゃん さん答えありがとうございます。
規則性は前半が漢字で、文字数は決まってないです
後半は数字で、文字数は決まってないです

【32573】Re:文字の選別
発言  かみちゃん  - 05/12/18(日) 14:53 -

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

>規則性は前半が漢字で、文字数は決まってないです
>後半は数字で、文字数は決まってないです

それでは、以下のような感じではいかがでしょうか?

Sub Macro1()
 Dim strOrg As String
 Dim i As Long, x As Long
 Dim Mynum(1) As String
 
 strOrg = "日本2005"
 For i = Len(strOrg) To 1 Step -1
  If Not IsNumeric(Mid(strOrg, i, 1)) Then
   x = i + 1: Exit For
  End If
 Next i
 If x = 0 Then
  Mynum(1) = strOrg
 Else
  Mynum(1) = Mid(strOrg, x)
 End If
 Mynum(0) = Replace(strOrg, Mynum(1), "")

 MsgBox Mynum(0) & vbCrLf & Mynum(1)
End Sub

下記の過去ログを参考にしてみました。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=31984;id=excel

【32574】Re:文字の選別
質問  俊之  - 05/12/18(日) 15:03 -

引用なし
パスワード
   たびたびありがとうございます

なにぶん素人なもんで、頂いた式はどのように処理したらよろしいのでしょうか?

すみませんが教えて下さい。

【32575】Re:文字の選別
発言  かみちゃん  - 05/12/18(日) 15:15 -

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

>なにぶん素人なもんで、頂いた式はどのように処理したらよろしいのでしょうか?

処理したいことが今ひとつよくわからないのですが、このように書けばよかったですか?

Sub Macro1()
 Dim strOrg As String
 Dim i As Long, x As Long

 With Range("A1")
  strOrg = .Value
  For i = Len(strOrg) To 1 Step -1
   If Not IsNumeric(Mid(strOrg, i, 1)) Then
    x = i + 1: Exit For
   End If
  Next i
  If x = 0 Then
   .Offset(, 1).Resize(, 2).Value = Array("", strOrg)
  Else
   .Offset(, 1).Resize(, 2).Value = Array(Replace(strOrg, Mid(strOrg, x), ""), _
                        Mid(strOrg, x))
  End If
 End With
End Sub

【32577】Re:文字の選別
質問  俊之  - 05/12/18(日) 15:30 -

引用なし
パスワード
   A1に入力するのは文字数が決まっていないが、前半は漢字、後半は数字
これを
B1には漢字を表示
C1には数字を表示
できるような関数が知りたいなと思っています


最初に教えていただいた
B1 → Mid(A1,1,2)
C1 → Replace(Mid(A1,1,2),"")
がなんとなく感じよかったみたいです

【32578】Re:文字の選別
発言  かみちゃん  - 05/12/18(日) 15:35 -

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

>できるような関数が知りたいなと思っています

さきほど提示しなおしたコードでできない(動作確認していますが)なら、私には、わかりません。

なお、一般操作関数では無理ではないかと思います。

【32591】Re:文字の選別
発言  ichinose  - 05/12/18(日) 20:16 -

引用なし
パスワード
   ▼俊之 さん、かみちゃんさん、こんばんは。

>A1に入力するのは文字数が決まっていないが、前半は漢字、後半は数字
>これを
>B1には漢字を表示
>C1には数字を表示
>できるような関数が知りたいなと思っています
かみちゃんさんのコードで良いと思いますけどね!!

敢えて数式で行うなら・・・、長いですよ!!

セルA1に
「野ブタ2005」という文字列が入っていたとします。


・「挿入」---「名前」---「定義」とクリックし、名前の定義ダイアログを
 表示させます。

・ここで「numeric」という名前を
 参照範囲を
 「={"0";"1";"2";"3";"4";"5";"6";"7";"8";"9";"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"}」

として登録します(両端の「」は除く、以降の数式も同様です)。
これは、全角の数字を分割対象としています。
全角は対象外の場合は

参照範囲を

「={"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"}」

として下さい。

・名前と参照範囲を設定後、OKボタンを押して下さい。


・次に数式です。

セルB1に

 「=IF(MIN(IF(ISERROR(FIND(numeric,A1)),LEN(A1)+1,FIND(numeric,A1)))>LEN(A1),A1,
MID(A1,1,MIN(IF(ISERROR(FIND(numeric,A1)),LEN(A1)+1,FIND(numeric,A1)))-1))」

但し、配列を使用していますから、
セルの確定はEnterキーではなく、
Ctrl+Shift+Enterキーで確定してください。

セルC1には、

 「=SUBSTITUTE(A1,B1,"")」

セルの確定はこちらはEnterキーです。


これでセルA1の文字列を変えて試して見てください。


私は、こんなに長くなってしまった数式は業務では
使いません(作るときは良いですが、後で見返したときに
どういう意味だったか理解するのに、すっごく苦労しそうです)。

やっぱり、かみちゃんさんのコードで良いと思いますけどね!!

参考程度に見といてください。

【32592】Re:文字の選別
回答  Kein  - 05/12/18(日) 20:20 -

引用なし
パスワード
   各セルに入力するところが分からないのでしょーか ?
ちょっとやり方を変えて・・

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long, x As Long

  With Target
   If .Address <> "$A$1" Then Exit Sub
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Value) Then Exit Sub
   If IsNumeric(.Value) Then Exit Sub
   Application.EnableEvents = False
   For i = 0 To 9
     x = InStr(1, i, .Value)
     If x > 1 Then
      .Offset(, 1).Value = Left(.Value, x - 1)
      .Offset(, 2).Value = Mid(.Value, x)
      Exit For
     End If
   Next i
  End With
  Application.EnableEvents = True
End Sub

というイベントマクロをシートモジュールに入れ、A1に "文字+数値" のデータを
入力してみて下さい。

【32600】Re:文字の選別
回答  awu  - 05/12/19(月) 11:17 -

引用なし
パスワード
   関数の使用を希望されているようですが、ワークシート関数では、数式が
長くなって可読性が悪くなったり、ワーク用の列を使用するなど煩雑になる
かと思います。

それで、状況から察しますと、ユーザー定義関数を使う方法が、得策と思います。

ここでは、例として StrSplit関数を作成することにします。

使い方は、=StrSplit(文字列 , 1または2)

◎ 第2引数に「1」を指定した場合の戻り値:
 ・文字列の中に数字が存在する場合、それより左の文字列
 ・数字が含まれていない場合は、その文字列
 ・数字から始まる場合は、長さ0の文字列

◎ 第2引数に「2」を指定した場合の戻り値:
 ・文字列に数字が存在すると、最初の数字を含めその右の文字列
 ・数字が無い場合は、長さ0の文字列
 ・数字から始まる場合は、その文字列

使用例:セルA1に "日本2005" の文字列が入力されているとして

 =StrSplit(A1,1)  で、"日本" が表示されます。
 =StrSplit(A1,2)  で、"2005" が表示されます。

普通の関数のように式をコピーすることが出来ます。

これで宜しかったら、次の手順で操作してみてください。 

1.Alt + F11 で VBE(Visual Basic Editor)を開きます。
2.VBE のメニューから[挿入] -->[標準モジュール] を指定します。
3.コードウィンドウに下記コード(19行)をコピーして貼り付けます。
4.Alt + Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。
5.メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティ
  レベル」を 「中」にして[OK]します。
6.これで、ブック内のシートで StrSplit関数が使用できます。


Function StrSplit(WStr As String, N As Integer) As String
Dim L As Integer
Dim Pog As Integer
Application.Volatile
For L = 1 To Len(WStr)
  If IsNumeric(Mid(WStr, L, 1)) Then Exit For
Next L
If N = 1 Then
  If L = 1 Then
    StrSplit = ""
  Else
    StrSplit = Left(WStr, L - 1)
  End If
ElseIf N = 2 Then
  StrSplit = Mid(WStr, L)
Else
  StrSplit = ""
End If
End Function

【32607】Re:文字の選別
お礼  俊之  - 05/12/19(月) 14:48 -

引用なし
パスワード
   色々と参考、答えを出していただき、みなさん有難うございます
これらを参考に頑張ってみます。

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