[[20150620212620]] 『複数セルの文字列を指定の文字列を挟みながら連結』(スカボロー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数セルの文字列を指定の文字列を挟みながら連結する』(スカボロー)

A1〜A10に文字列を入力し、
B1=A1
B2=B1&","&A2
としてB2をB10までコピーしたらA1〜A10の文字列が","を挟んで連結されます。

また、ユーザー定義関数で

Function myconc(ByVal r As Range, mystr As String) As String

 Dim c As Range
  myconc = ""
  For Each c In r
   If myconc <> "" Then myconc = myconc & mystr
   myconc = myconc & c.Value
  Next c
End Function

とし、セルに
=myconc(A1:A10,",")
で作業列を使った方法と同じ結果が得られます。

いま調べているのは、これを作業列やユーザー定義関数を使わず、配列数式
で出来ないか、ということです。

作業列を使ってもさほど手間は掛からないのですが、もし一つのセルを使って
数式で出来る方法があればと思い質問させていただきました。

方法がありましたらご教示お願いいたします。

< 使用 Excel:Excel2007、使用 OS:WindowsVista >


http://www.relief.jp/itnote/archives/001157.php

 >CONCATENATE関数で指定する引数は、SUM関数などと似ているので、
 >「=CONCATENATE(A1:A5)」
 >のように「:」(コロン)を使ってセル範囲を指定してその文字列を全部結合できるとお考えになる方もいらっしゃるようですが、残念ながらこれはできません。

このページでユーザー定義関数が紹介されてました。
ということはやはりエクセルの一般機能ではできなさそうです。
通常は作業列を使うことで対処したいと思います。
お騒がせしました。
(スカボロー) 2015/06/20(土) 22:26


目的次第なのですが、
 ・ユーザー定義関数を使いたくない(どのPCでも使えないと困る)
 ・作業列を使いたくない
 ・一つのセルに長い数式を入力するのは面倒だ

 少しでも入力の手間を省きたいというのであれば、
 値でなく、アドレスを連結するマクロ(数式を作成するマクロ)
 にしてはどうでしょうか。
 マクロは使うけど、入力のためだけ。

 ただ汎用性のあるマクロではないので
 使用頻度が少ないと、本末転倒かもしれません。

 今回のケースとちょっと違いますが、
 規則性はあって、 単純な式なんだけど、
 でもフィルコピーが使えないといった場合など 
 マクロで数式入力すると簡単なことがあります。

 ↓は、アクティブセルに、指定したセルを指定の文字で連結する数式が入ります。

 Sub test()
    Dim r As Range
    Dim d As String
    Dim c As Range
    Dim s As String

    If Not IsEmpty(ActiveCell) Then
        If MsgBox("Overwrite OK?", vbOKCancel) = vbCancel Then Exit Sub
    End If

    On Error Resume Next
    Set r = Application.InputBox("Select cells", Type:=8)
    On Error GoTo 0
    If r Is Nothing Then Exit Sub
    If r.Count = 1 Then Exit Sub

    d = Application.InputBox("Input delimiter", Type:=2)

    If d = "False" Or d = "" Then
        d = ","
    Else
        d = ",""" & d & ""","
    End If

    For Each c In r
        s = s & d & c.Address(0, 0)
    Next

    s = Mid(s, 1 + Len(d))
    s = "=concatenate(" & s & ")"

    ActiveCell.Formula = s

 End Sub

(マナ) 2015/06/21(日) 16:18


 マナさん、ご回答ありがとうございます。

 たとえば、PDF編集アプリケーションで一つのPDFファイルを複数のPDF
 ファイルに切り分けるとき、InputBoxに切り分けるポイントをページ番号で

 2,5,6,11,15

 というように入力するものがあります。
 こういう場合にエクセルでセルにページ番号を入れていって最後に「,」で
 挟んでInputBoxに入力する文字列を生成する、としたいときに今回の質問の
 ようなことが簡単にできたらいいな、と思うことがあります。

 頻繁に使うようなものでしたらエクセルで専用のブックを作っておいたり
 ユーザー定義関数やアドインなどで作っておく、とすればいいのですが、
 作っておいても存在を忘れたり操作方法を忘れたりします。

 エクセルの標準機能で出来ても手順を忘れたら同じことですのでだったら
 何で質問したのだ?ということになってしまいますが・・・

 マナさんにご教示いただきましたInputBoxを使った方法も試させていただ
 きました。

 これでしたら結合対象セルや区切り文字を機動的に設定できますね。

 最初の質問の意図からは本末転倒ですが、下記のような方法でも行けました。

 選択セル範囲の内容をクリップボードに格納し、クリップボードの内容の
 タブや改行を区切り文字に変換、というものです。

 '参照設定:Microsoft Forms ** Object Library

 Sub test()
  Dim ndt As New DataObject
  Dim mycb As String
  Dim mystr As String
  	Selection.Copy
  	Set ndt = New DataObject
  	With ndt
		.GetFromClipboard
  		mycb = .GetText
  	End With
  	mystr = Replace(cbstr, vbTab, ",")
  	mystr = Replace(mystr, vbLf, ",")
  	Range("A1").Value = mystr
 End Sub

 配列数式などの一般機能に拘らずに場面場面にあった方法で対処していき
 ます。

 ありがとうございました。
(スカボロー) 2015/06/22(月) 01:16

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.