[[20180521134359]] 『セル内の先頭空白が消えません』(apuro) ページの最後に飛ぶ

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

 

『セル内の先頭空白が消えません』(apuro)

お世話になっております。

A〜G列約800行のデータベースで、文字・数値混在のA列を文字列に変換して、ソートを掛けようとしています。
なんとかエラーがかからずにコードを組めたようなのですが、ソート結果が正しく反映されておらず、セル内を確認したところ、どうも表示されない空白部分があることが判りました。
(セル内ダブルクリックしてbackspase→ソートを掛けるとその行は正しい位置に移動しているのを確認、というアナログな確認方法で判明しました)

掲示板内検索でTrim関数を使えば消えると判ったものの、組み込んでみても消えておりません。

Trimの使い方が間違っているのでしょうか?
ご教授宜しくお願い致します。

Private Sub CommandButton1_Click()

    Dim i As Long, ir As Long, S As Long
    Sheets("作業").Select
    Columns("A:A").Select
    Selection.ColumnWidth = 15
    S = Range("A2").End(xlDown).Row

    For i = 1 To S
        With Cells(i, "A")
        .NumberFormatLocal = "@"
        End With
    Next i
    Application.Trim (S)

    ir = S
        With ActiveSheet.Sort.SortFields
            .Clear
            .Add Key:=Range("A1"), Order:=xlAscending
        End With
        With ActiveSheet.Sort
            .SetRange Range(("A1"), ("G") & ir)
            .Header = xlYes
            .Apply
        End With

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 関数は引数を変化させるものではなく、引数の値を変化させたものをその関数の返値とするもの。
 セルの値 = Application.Trim(セルの値)
 のように使ってみてくれ。
(ねむねむ) 2018/05/21(月) 14:07

ねむねむ様

早速のご回答ありがとうございます。

当該部分を書き換えて

S = Application.Trim(S)

としてみたのですが、結果が変りません。
「セルの値」の考え方が間違っているのでしょうか?

(apuro) 2018/05/21(月) 14:25


 SというのはA列の最下行の行番号ではないのか?
(ねむねむ) 2018/05/21(月) 14:41

怪しいセルに対し、VBAの編集画面で、イミディエイトウィンドウ上で以下を実行してみてください。
? hex(asc(right(range("A1"),1)))

右端ではなく左端の場合は、left です。 何が表示されるか教えてください。(0d とかではないかと予想)
(???) 2018/05/21(月) 15:01


ねむねむ様

(@_@)!?

 S = Range("A2").End(xlDown).Row

これで、A列選択したつもりになってました。

Dim Si As Range
Set Si = Range(("A2"), ("A") & S)

を追加して、Trim関数に組み込んだところ、ちゃんとソートしてくれました!
ありがとうございました!!!m(__)m

???様

取り敢えず望みの結果は得られたのですが、書き換える前の段階に戻って試してみました。

? hex(asc(left(range("A2"),1)))
36

と出てます。

これで何が判るようになるのでしょうか?
せっかくなので、教えて頂ければ助かります。
宜しくお願い致します。

(apuro) 2018/05/21(月) 15:17


ascで文字コードが判るのです。 なので、見えない制御文字とかあった場合に、そのコードを知る事ができるのですよ。 なお、&H36 なら「6」という数字なので、問題ないです。
(???) 2018/05/21(月) 15:46

???様

「見えない制御文字」に興味をおぼえて一寸検索してみました。
なんか厄介な奴なんですね。

インポートしたデータを加工する場合、プログラムがいうことを聞いてくれない時は、こういう事態も考えてみないとなのですね。
勉強になりました。

それ以前に、私はコーデイングがまだまだ怪しいので、それで動かない可能性の方が多いんでしょうが(__;
イミディエイトウインドウも、この掲示板ではよく目にしていましたが、実際使ったのは今回初めてなので、もっと利用してみたいと思います。

ありがとうございました。
(apuro) 2018/05/21(月) 16:59


半角スペースを消すなら、

Private Sub CommandButton1_Click()

    With Me.Range("A1").CurrentRegion
        With .Columns("A")
            .NumberFormatLocal = "@"
            .Replace " ", ""
        End With
        .Sort Key1:=.Range("A1"), Order:=xlAscending, Header:=xlYes
    End With
End Sub

置換機能で消したら、ループしなくていいかも?
(まっつわん) 2018/05/21(月) 17:17


まっつわん様

コメントありがとうございます。
自分の組んだコードの半分位短くなってる!?
すごい!!
と、組み込んで走らせてみたんですが・・・

With Me.Range("A1").CurrentRegion

↑の「.Range」で【コンパイルエラー メゾットまたはデータメンバーがみつかりません】となって止まってしまいます。

必要なコードまで消してしまってるんでしょうか?(TT)

Private Sub CommandButton1_Click()
'

    Sheets("作業").Select
    Columns("A:A").Select
    Selection.ColumnWidth = 15

    With Me.Range("A1").CurrentRegion
        With .Columns("A")
            .NumberFormatLocal = "@"
            .Replace " ", ""
        End With
        .Sort Key1:=.Range("A1"), Order:=xlAscending, Header:=xlYes
    End With

End Sub

(apuro) 2018/05/22(火) 17:12


たぶん、こうやりたいのでは?

 with Sheets("作業")
    .Columns("A:A").ColumnWidth = 15
    with .Range("A1").CurrentRegion

(もこな2) 2018/05/22(火) 19:37


もこな2様
ありがとうございます。

書き直してすっきり!と喜んだのもつかの間、単純に書き換えて頂いたのを置き換えただけでは動かず、ごちゃごちゃ試しておりました。
やっとエラーが出なくなったのですが、今度は肝心の「空白」が消えてくれていません(TT)
軽くなる可能性があるなら、こちらでいきたいのですが、いったい何がいけないのでしょう?

Private Sub CommandButton1_Click()

    With Sheets("作業")
        .Columns("A:A").ColumnWidth = 15
        With Range("A1").CurrentRegion
            With .Columns("A:A")
                .NumberFormatLocal = "@"
                .Replace " ", ""
            End With
        .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes
        End With
    End With
End Sub
(apuro) 2018/05/25(金) 11:02

 今度は肝心の「空白」が消えてくれていません(TT) 

                 .Replace chrw(160), ""
 では?
(seiya) 2018/05/25(金) 11:43

seiya

お世話様です。
やはり変化ありません。

chrw(160),ってなにもの?と調べて行ったらCODE関数にたどり着きまして、試しに一つ入れてみました。
結果は「54」と出ます。
ASCIIコードで6ですよね。
当該セルには9桁の数字が入っていますが(視覚的に)左端の数字も「6」です。

…なのですが、そのセルをダブルクリックして、左にカーソルを置いてDELすると確かに何かが消えています。
で、5/21の状況に戻ってしまいます。
この状況は、これ以上変わらないのでしょうか。

んー勿体ない(__;
(apuro) 2018/05/25(金) 14:41


んー勿体ない(__;

折角Withを使っているのに何度も同じことを書かない
1行1行の意味を理解しようとしていますか?
マクロを作れるようになりたいなら、解らないことは聞いて潰しておいてください。

これで大抵のわけのわからない文字列は消えるはず?

Private Sub CommandButton1_Click()

    With Me.Range("A1").CurrentRegion
        With .Columns(1)
            .ColumnWidth = 15
            .NumberFormatLocal = "@"
        End With
        With .Columns(.Columns.Count + 1)
            .Formula = "=TRIM(CLEAN(SUBSTITUTE(A1,CHAR(160),"" "")))"
            .Offset(, -1 * .Column + 1).Value = .Value
            .ClearContents
        End With
        .Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlYes
    End With
End Sub

あれ?もしかしてボタンが配置されているシートは、操作するシートじゃないのかな?

どのシートの操作をしたいかよくわからないけど、MeをSheets("作業")に
変えたらいいかも?

Meって私って意味ですよね?
どのシートのモジュールにコード書いているかわからないけど、
書いたモジュールのオブジェクトが私になります。
Meとあえて書かなくてもエクセル君はわかってくれるけど、
どのシートを操作したいのか、自分に言い聞かせる意味で書いてます。

あと、文字コードの件ですが、
ここにコピペして、人に調べてもらうってのもありかもです。
そういうことが頼めるのが掲示板のいいところだと思います。
(まっつわん) 2018/05/25(金) 15:55


 >A〜G列約800行のデータベースで、

 試しに、

 Private Sub CommandButton1_Click() 
    With Sheets("作業")
        .Columns("A:A").ColumnWidth = 15
        With .Range("A1").CurrentRegion
            With .Columns("A:A")
                .NumberFormatLocal = "@"
                .Value = Application.Clean(.Value)
                .Replace " ", ""
            End With
           .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes
        End With
    End With
End Sub

(seiya) 2018/05/25(金) 16:58


コメント返信:

[ 一覧(最新更新順) ]


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