Excel VBA質問箱 IV

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

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


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

【41378】()の判別 ℃素人 06/8/8(火) 9:02 質問[未読]
【41379】Re:()の判別 Blue 06/8/8(火) 9:23 回答[未読]
【41402】Re:()の判別 ℃素人 06/8/9(水) 8:18 質問[未読]
【41404】Re:()の判別 Blue 06/8/9(水) 8:45 回答[未読]
【41412】Re:()の判別 ℃素人 06/8/9(水) 11:30 質問[未読]
【41414】Re:()の判別 Blue 06/8/9(水) 12:36 回答[未読]
【41418】Re:()の判別 ℃素人 06/8/9(水) 16:58 質問[未読]
【41419】Re:()の判別 Blue 06/8/9(水) 17:04 回答[未読]
【41428】Re:()の判別 ℃素人 06/8/10(木) 7:37 お礼[未読]

【41378】()の判別
質問  ℃素人  - 06/8/8(火) 9:02 -

引用なし
パスワード
   いつもここでお世話になっています。
今回もよろしくお願いします。

運送会社の送り状発行ソフトでお届け先名が長すぎるデータ(15文字以上)があるためエラーが頻繁に発生します。

基幹のマスターDBからcsvにデータを出力後、エクセルマクロでデータを整えて印刷しようと考えています。

私の会社の性質上、お客様の社名の後ろにさらにそこからのユーザー(エンドユーザー)名を登録しています。

例:) (株)ABCD(XYZ有限会社様向)

このような社名体系を使用していて、後ろの()部分だけを切り取って他の列に貼り付けたいと思って試行錯誤していますが、うまくいかないというか何をしたらいいのかまったくわかりません。

どうか、よろしくお願いします。

【41379】Re:()の判別
回答  Blue  - 06/8/8(火) 9:23 -

引用なし
パスワード
   文字列の後ろから、InstrRev関数で")" の位置を探して、その位置から直前の "(" の位置を探して、Mid関数切り出す。
※ただし、「(株)ABCD(XYZ(有)様向)」のように括弧が入れ子になっている場合工夫が必要。

Dim s    As String
Dim startPos As Long
Dim endPos  As Long

s = "(株)ABCD(XYZ有限会社様向)"

endPos = InStrRev(s, ")")
If endPos <> 0 Then
  startPos = InStrRev(s, "(", endPos)
  If startPos <> 0 Then
    MsgBox Mid$(s, startPos + 1, endPos - startPos - 1)
  End If
End If

【41402】Re:()の判別
質問  ℃素人  - 06/8/9(水) 8:18 -

引用なし
パスワード
   ▼Blue さん:
1列に100行のデータが存在します。
Blueさんに教えていただいたVBAで昨日、一日中思考錯誤を繰り返しましたが結局できません。

例えばA列に会社名があるとして、()の部分をB列に移動させたい場合はどうやったらいいのでしょうか?

よろしくお願いします。

【41404】Re:()の判別
回答  Blue  - 06/8/9(水) 8:45 -

引用なし
パスワード
   ▼℃素人 さん:
>Blueさんに教えていただいたVBAで昨日、一日中思考錯誤を繰り返しましたが結局できません。
なにを試行錯誤し、どううまくいかなかったのか具体的に書かれたほうがよいです。

>例えばA列に会社名があるとして、()の部分をB列に移動させたい場合はどうやったらいいのでしょうか?
タイミング的にはどういうタイミングで行いたいのでしょうか?
マクロを呼んで一気に処理させたいとか、A列に入れた瞬間とか。


とりあえず、マクロを呼んでA1のセルから、データのある最終行まで処理するコードです。


Option Explicit

Public Sub test()
  Dim endRow As Long
  Dim i   As Long
  
  ' A列の最終行を取得
  endRow = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
  ' 1行目から最終行まで処理
  For i = 1 To endRow
    With Worksheets("Sheet1").Cells(i, 1)
      ' A列の括弧の中身を取り出しB列に入れる
      .Offset(, 1).Value = ForCompany(.Value)
    End With
  Next
End Sub

' 文字列の後ろから括弧の中身を取得する関数
Private Function ForCompany(ByVal text As String)
  Dim startPos As Long
  Dim endPos  As Long

  ' 終了括弧の位置
  endPos = InStrRev(text, ")")
  If endPos <> 0 Then
    ' 開始括弧の位置
    startPos = InStrRev(text, "(", endPos)
    If startPos <> 0 Then
      ForCompany = Mid$(text, startPos + 1, endPos - startPos - 1)
    End If
  End If
End Function

【41412】Re:()の判別
質問  ℃素人  - 06/8/9(水) 11:30 -

引用なし
パスワード
   ▼Blue さん:
ありがとうございます。やっとゴールが見えてきました。
private functionという機能を知らなかったので、Blueさんに教えていただいた関数を入れる場所をずっと試行錯誤していました。

それとまたまた質問なのですが、Blueさんにいただいたマクロで()内のTEXTは隣の列に移るようになりました!
ですが、もともとのデータ(この場合A列にある)の株式会社ABCD(XYZ有限会社様向)とある(XYZ有限会社様向)を削除したいのですがどうしたらいいでしょう?
ちょっと日本語がおかしいかもしれませんが、
ようするに、隣の列に移したら元データの方の括弧ごと削除したいのです。

ご教授お願いいたします。

【41414】Re:()の判別
回答  Blue  - 06/8/9(水) 12:36 -

引用なし
パスワード
   ▼℃素人 さん:
>ですが、もともとのデータ(この場合A列にある)の株式会社ABCD(XYZ有限会社様向)とある(XYZ有限会社様向)を削除したいのですがどうしたらいいでしょう?

変更点が結構あるので、どこがどう変わっているのか、
ByRefって?なんでFunctionからSubになったのか?を理解して使ってください。

Option Explicit

Public Sub test()
  Dim endRow As Long
  Dim i   As Long
  Dim fromCompany As String
  Dim toCompany  As String
 
  ' A列の最終行を取得
  endRow = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
  ' 1行目から最終行まで処理
  For i = 1 To endRow
    With Worksheets("Sheet1").Cells(i, 1)
      ' A列の文字列から会社名の取得
      Call GetCompanyInfo(.Value, fromCompany, toCompany)
      ' 各セルに反映
      .Value = fromCompany
      .Offset(, 1).Value = toCompany
    End With
  Next
End Sub

' 文字列の後の括弧を元に、会社名を取得する関数
Private Sub GetCompanyInfo(ByVal text As String, _
              ByRef fromCompany As String, _
              ByRef toCompany As String)
  Dim startPos As Long
  Dim endPos  As Long

  ' 終了括弧の位置
  endPos = InStrRev(text, ")")
  If endPos <> 0 Then
    ' 開始括弧の位置
    startPos = InStrRev(text, "(", endPos)
    If startPos <> 0 Then
      ' 括弧の中身を取得
      toCompany = Mid$(text, startPos + 1, endPos - startPos - 1)
      ' 括弧の前を取得
      fromCompany = Left$(text, startPos - 1)
    End If
  End If
End Sub

【41418】Re:()の判別
質問  ℃素人  - 06/8/9(水) 16:58 -

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

>変更点が結構あるので、どこがどう変わっているのか、
>ByRefって?なんでFunctionからSubになったのか?を理解して使ってください。

ByRefが引数を参照して別のプロシージャに渡すという事はわかりました。
ですが、未だになぜfunctionではだめなのかがわかりません。
単純にfunctionではByRefが使えないだけなのでしょうか?


それと、Blueさんにいただいた通りにコピーして貼り付けて実行しました結果。
なぜか、すべての送り先会社名が()を含む会社名に変わってしまいます。

本当に申し訳ございません。
そして、私の説明ミスに気づきました。
送り先の会社名は
単純に「株式会社ABC」という形式と私がしつこくいっている「株式会社ABC(DFG株式会社様向け)」という二つの形式があります。

本当にお手数をおかけしますが、何卒ご教授のほどよろしくお願いします。

【41419】Re:()の判別
回答  Blue  - 06/8/9(水) 17:04 -

引用なし
パスワード
   ▼℃素人 さん:
>ですが、未だになぜfunctionではだめなのかがわかりません。
いいえ、単純に値を返す必要がなくなったからです。
Functionは何か値を返すときに使います。
今回は、値を返したいものが2つになってしまったので、Functionではなく
ByRefの引数で設定するようにしました。
(ByRefの引数を使わないで「ユーザ定義型」の値を返すFunctionにすることも可能)

>それと、Blueさんにいただいた通りにコピーして貼り付けて実行しました結果。
>なぜか、すべての送り先会社名が()を含む会社名に変わってしまいます。
>
>本当に申し訳ございません。
>そして、私の説明ミスに気づきました。
>送り先の会社名は
>単純に「株式会社ABC」という形式と私がしつこくいっている「株式会社ABC(DFG株式会社様向け)」という二つの形式があります。

単純に「株式会社ABC」のパターンのときはB列にはなにが入りますか?
空でイイのであれば、GetCompanyInfo関数の先頭で、fromCompany と toCompany を初期化するような記述を入れておきましょう。

' 文字列の後の括弧を元に、会社名を取得する関数
Private Sub GetCompanyInfo(ByVal text As String, _
              ByRef fromCompany As String, _
              ByRef toCompany As String)
  Dim startPos As Long
  Dim endPos  As Long

  ' 初期化
  fromCompany = text
  toCompany = ""

  ' 終了括弧の位置
  endPos = InStrRev(text, ")")
  If endPos <> 0 Then
    ' 開始括弧の位置
    startPos = InStrRev(text, "(", endPos)
    If startPos <> 0 Then
      ' 括弧の中身を取得
      toCompany = Mid$(text, startPos + 1, endPos - startPos - 1)
      ' 括弧の前を取得
      fromCompany = Left$(text, startPos - 1)
    End If
  End If
End Sub

【41428】Re:()の判別
お礼  ℃素人  - 06/8/10(木) 7:37 -

引用なし
パスワード
   ▼Blue さん:
本当に本当にありがとうございます!

Blueさんのおかげでやりたいことが思ったより早くできました!!
本当に助かります。

言葉にならないほど感謝の気持ちでいっぱいです。

ちなみに、VBAとはちょっと関係ない話ですが

BlueさんはどうやってVBAを勉強しましたか?
独学でしょうか?または、学校か何か?
もし、独学でしたら何を参考に勉強しましたか?
本でしょうか?こういったインターネットのサイトでしょうか?
私もBlueさんみたいになんでもすぐにマクロにできるようになりたいのです。
おすすめの本、またはサイト、なんでも結構ですのでよろしければ教えてください。

今回は本当にありがとうございました。

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