[[20241024162717]] 『TextColumnsの動作について』(わっつん) ページの最後に飛ぶ

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

 

『TextColumnsの動作について』(わっつん)

プログラム中に以下のような行があります。
この行はどんな動きをするのでしょうか?

ネットで見ると文字列を区切るようなことがかかれていたので
例えば[B5]B5のセルに[1<tab>2](tab=trueなので)
が入力されていると
[B5]に[1][B6]セルに[2]が表示されるのかと思ったのですが
何も起こりませんでした。

具体的にどんなときにどうなるのか教えてください

    Set rng = wsmake.Range("B5:B25")
    rng.TextToColumns Destination:=wsmake.Range(wsmake.Range("B5").Address), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 2), TrailingMinusNumbers:=True

< 使用 Excel:Excel2016、使用 OS:Windows11 >


以下ChatGPTの回答です。全く検証していないので悪しからず。

コードの解説:
wsmakeシートのセル範囲 B5:B25 を対象とした範囲 (rng) を設定しています。
TextToColumns メソッドを使って、テキストデータを複数の列に分割する操作を行います。
分割先の範囲は、B5セルから開始しています (Destination:=wsmake.Range(wsmake.Range("B5").Address) で指定)。
DataType:=xlDelimited は、デリミタ(区切り文字)による分割を行うことを指定しています。
TextQualifier:=xlDoubleQuote は、二重引用符で囲まれたテキストを1つのセルとして扱うことを指定しています。
Tab:=True は、タブ文字をデリミタとして使用することを指定しています。タブを基準にテキストが分割されます。
Semicolon:=False, Comma:=False, Space:=False, Other:=False は、それぞれ他のデリミタ(セミコロン、カンマ、スペース、その他の任意の文字)を無効化しています。
FieldInfo:=Array(1, 2) は、分割後の列の書式を指定しています。この場合、最初の列 (Array(1, ...)) は「テキスト」形式(2)として扱われます。
TrailingMinusNumbers:=True は、負の数値が末尾にマイナス記号がある形式の場合でも正しく数値として処理するオプションです。

どのような時にこのコードが使われるか:
列 B5:B25 に、タブで区切られたデータが入っている場合、これを列に分割する処理を行います。
例えば、セル B5 に "Data1\tData2" のようにタブ区切りのデータがある場合、それぞれのデータを別々の列に分割して配置します。
データの形式が「タブ区切り」のもので、分割後のデータをテキストとして扱いたい場合にこのコードが使われます。

結果:
範囲 B5:B25 のデータが、タブを区切り文字として複数の列に分割され、結果がセル B5 からスタートする列に書き込まれます。

(うど) 2024/10/24(木) 16:58:09


 すでに回答がついてますが、せっかく書いたので、
 >[B5]に[1][B6]セルに[2]
 <TAB>がほんとにTABコードなら
 B5 に 1  C5 に 2  になります。

 タブは Char(10) です
 例えばB5:B25 に
 ="1234" & CHAR(10) & "4567"
 といれて、コピーして値貼り付け
 または
 VBEのイミディエイトウィンドウで
 Range("B5:B25").Value = "1234" & vbTab & "4567"
 を実行してから動かしてみてください。

 FieldInfo:=Array(1, 2) が指定されているのでRngの1列目(B列)は文字列になります。
 XlColumnDataType 列挙 (Excel)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.xlcolumndatatype
(´・ω・`) 2024/10/24(木) 17:00:52

新規にブックを開きます。
シートにボタンを配置して以下のコードを入れます。

Private Sub CommandButton1_Click()

    Dim rng As Range
    Dim wsmake As Worksheet

    Set wsmake = Worksheets("sheet1")
    Set rng = wsmake.Range("B5:B25")
    rng.TextToColumns Destination:=wsmake.Range(wsmake.Range("B5").Address), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=False, _
        FieldInfo:=Array(1, 2), TrailingMinusNumbers:=True
End Sub
      TAB(4と5の間)
       ↓
メモ帳に[1234 5678]を入力し、コピーして
[B5]セルを選択し、名前ボックスを[B5]にして
数式バーに[1234 5678]を貼り付けます。
次にボタンを押すと...
やはり何も変化が見られません。
なにか間違っていますか?

ちなみに
wsmake.Range("B5:B25")になっているので
このコードは
"B5:B25"の各セルの結果がすべて"B5"に反映されるのでしょうか?
それとも、B5はB5,B6はB6それぞれに表示されるのでしょうか?

(わっつん) 2024/10/25(金) 08:28:31


 私の手元で確認しました。正常に動作しました。
 そちらで動作しない原因はちょっとわかりません。
 その例で、実行前に =LEN(B5) とすると何が返りますか?念のため確認します。

 Destinationは Destination:=wsmake.Range("B5") と書くのが普通でしょう。
 それはさておき、疑問の点ですが、
 B5はB5とC5に分離されて表示されます。
 B6はB6とC6に。

 ヘルプにあるように
 | Destination
 | Range オブジェクトでの結果の表示先を指定します。 
 | 表示先に指定したセル範囲が複数セルである場合には、左上端のセルが使われます。
 条件付き書式でも、すべてのセルの式は書かずに、左上端のセルに関する式を入れるでしょう?
 それと同じような趣旨です。代表セルについて書けば、あとは増幅してくれる、と考えておいてください。
(xyz) 2024/10/25(金) 08:51:21

Set wsmake = Worksheets("sheet1")
この行で停止させて
ウォッチで確認すると

Len("B5") は 2 になっています。

(わっつん) 2024/10/25(金) 09:25:39


 | [B5]セルを選択し、名前ボックスを[B5]にして
 | 数式バーに[1234 5678]を貼り付けます。
 としたんですよねえ。なぜ長さ2になるのでしょうか。
(xyz) 2024/10/25(金) 09:31:03

(´・ω・`)さん

タブは Char(10) です 例えばB5:B25 に ="1234" & CHAR(10) & "4567" といれて、コピーして値貼り付け B5からB25を選択して
数式バーに[="1234" & CHAR(10) & "4567"]を入力しました。
B5のセルだけ[="1234" & CHAR(10) & "4567"]が
そのまま表示されます。
で、B5を選択して、B5:B25にコピーしました
B5:B25のセルが[="1234" & CHAR(10) & "4567"]になりました

VBEのイミディエイトウィンドウで Range("B5:B25").Value = "1234" & vbTab & "4567" を実行してから動かしてみてください。 イミディエイトウィンドウは
debug.print の表示出力以外使ったことがなく
実行する方法がわかりません。
(わっつん) 2024/10/25(金) 09:35:07

以下のように変更して stop の位置で確認しました。

    Range("B5") = "1234    5678"
    Stop
    Set wsmake = Worksheets("sheet1")

ウォッチでの結果
LEN(B5) は <ウォッチ式が不正です。> になります。
LEN("B5") は 2 です。
LEN("12345678") は 9 です。 (見た目はTabが見えませんがTabが入っています。)
               (式をクリックして編集状態になるとTabが見えます。)
LEN(Range("B5")) は 12 です。
Range("B5") は "1234 5678" です。(Tabではなくスペース4文字になっています。)

結果は上記の通りですが
訳が分かりません。

ちなみに 

実行前に =LEN(B5) とすると というのがどういうことをすればよいのかわかりませんでした。
最初は以下のようにするのかと思ったけど構文エラーがでるので違いますよね。
  =LEN(B5)
    Set wsmake = Worksheets("sheet1")

(わっつん) 2024/10/25(金) 09:47:45


 どこかのセルに =LEN(B5)です。
 私はいったんROMに回ります。
(xyz) 2024/10/25(金) 09:53:39

tabが入っていれば長さは9になる筈です。
スペース4文字はtabじゃないので分離されることはありません。
(xyz) 2024/10/25(金) 10:10:13

 >debug.print の表示出力以外使ったことがなく実行する方法がわかりません。
 debug.print も実行文です。実行の仕方は同じです。
 イミディエイトウインドウで 実行分を書いて、行末で Enterキー

 もし分からないなら、

 Sub setdata()
    Range("B5:B25").Value = "1234" & vbTab & "4567"
 End Sub

 と標準モジュールに書いて、このマクロを実行してください

 そのあと、TextToColumns のマクロを実行
(´・ω・`) 2024/10/25(金) 10:16:31

いろいろと手間を取らせてすみません。

Range("B5") = "1234 5678"
ではなく
Range("B5") = "1234" & vbTab & "5678"
にすると分割されるようになりました。

ただ

    Range("B5") = "1234" & vbTab & "5678"
    Range("B6") = "12" & vbTab & "56"

    Set wsmake = Worksheets("sheet1")
     :
   (以下同じ)

この場合、B6はなにも変わらずそのままです。

B5はB5とC5に分離されて表示されます。 B6はB6とC6に。 このようにならずに [B6]に[1256]が表示されています。
数式バーも見た目は[1256]ですがコピーしてメモ帳に
貼り付けると[12 56]になり、TABが入っています。
何が間違っているのでしょうか?

(わっつん) 2024/10/25(金) 10:20:23


すみません。

Set rng = wsmake.Range("B5:B25")の部分が
Set rng = wsmake.Range("B5:B5")になっていました。

ありがとうございました
(わっつん) 2024/10/25(金) 10:26:22


  | メモ帳に[1234 5678]を入力し、コピーして
  |  [B5]セルを選択し、名前ボックスを[B5]にして
  |  数式バーに[1234 5678]を貼り付けます。
 これでなぜスペース4文字になるんですか?理解不能。
 メモ帳ではなく別のエディターですか?

 提示されたコードと別のコードだったり、もう少し慎重に質疑応答して下さい。
 コードがこちらで動く以上、データが間違っているのは直ぐわかります。 
 だから大元のセルを確認して下さいと言うことでした。終了。

(xyz) 2024/10/25(金) 11:38:37


↑イライラすんな。
回答するからイライラすることも出てくる。当たり前。
当たり前のことが分からんようだったら、もう二度と回答すんな。偉そうに。

(サントス) 2024/10/25(金) 12:24:55


 >  メモ帳ではなく別のエディターですか?
 私が使っているエディターも、TABキーを押すと必要数のスペースに展開される機能を持っています。
 便宜上メモ帳と書きましたが、実は別のエディターです、というようなことなら理解できます。
 そういうことがあるとこちらも納得がいくのです。今のままだと何かスッキリ
 しないので確認したのです。

 サントスさん ご指摘ありがとう。
 貴兄も是非回答陣に加わってくださいな。楽しみにしています。
 サントスさんのHNは変えずにお願いします。
(xyz) 2024/10/25(金) 12:56:55

>サントスさん ご指摘ありがとう。
いやいや礼を言われるほどのことでもない。

>今のままだと何かスッキリしないので・・・
だから、なんでもかんでも全部スッキリすると思うな。
こっちは相手のこと見えないんだから、スッキリしないことがあるのはしょうがないだろ。

あと、楽しみにされているようだが、俺は回答はしない。
でも近いうちにHN変えて質問して、あんたに回答させてやるわ。
その直後「サントス」でしたって名乗る。ケッサクだわ。

(サントス) 2024/10/25(金) 13:42:31


 メモ帳は半角スペースに自動展開することはありませんが、
 別のエディターで当該機能を持つものがあります。
 なぜそういうことが起きたのかを理解しておくことは、質問者さんの益にもなります。

 質問者さんが使っているエディターが別の物なら、
 ・そういう変換がされることに気づいたり、
 ・4文字スペースがタブと同等と思っていたらその誤解に気づくこと
 などです。こちらのスッキリだけではないですよ。

 >俺は回答はしない。
 まあ、無理にとは申しません。無理は良くない。質問者さんに迷惑がかかる可能性がありますから。
 ひょっとしてサントスさんとは別HNで、既にあなたに回答したことがあるんじゃないですか?
 そんな気がします。結構な数の回答をしてきていますから、色々なことがあります。

 まあ今後どんな質問でもしてきてください。
 私は質問者さんだけを相手にしている積りはありませんので問題はありません。
 何がケッサクなのかちょっとわからない。
(xyz) 2024/10/25(金) 14:24:26

じゃーあんたがイライラするようなとっておきの質問とそのシナリオを考えとくわ。

>まあ今後どんな質問でもしてきてください。
こういうところ。
管理者でもないくせに、俺がここの中心みたいな偉そうな発言が癇に障るっていうこと。ほんと何様?
別にあんたに言われんでも、質問したいときには質問するっちゅーの。
あと、なんでもかんでも首つっこんで、どんだけ暇なん? ちゃんと仕事しろよ(こんなことしてるお前の方こそちゃんと仕事しろって言われそうだけど)。

(サントス) 2024/10/25(金) 15:04:02


 > でも近いうちにHN変えて質問して、あんたに回答させてやるわ。
 と言う発言にお応えしただけですけど?
 ご自分が何を発言したかくらい覚えておいてくださいよ。
(xyz) 2024/10/25(金) 15:35:42

コメント返信:

[ 一覧(最新更新順) ]


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