エクセル2000です。
アクセスから出力されたデータをエクセルに貼り付けた場合、問題がおきることがあります。
調べてみたら、アクセスでは、同じ空白でも、レコードが作られてからまだ一回もデータが入っていない状態と、何かデータが入ったことはあるが、削除されて今は空白になった状態をそれぞれ「Null値」と、「長さ 0 の文字列」との 2 種類に区別しているようです。
そのためなのか、それをコピーしてくるとエクセル側でも何もデータが入ってないのに「空白」とはみなされないセルができてしまい、マクロの動きをおかしくしてしまうことがあります。(今日、マクロが想定しない動きをして、その原因がわからず往生しました)
やむをえず以下のようなマクロをつくりましたが、Usedrangeが広いとこれもけっこう時間がかかります。
Sub Null化() '長さ0の文字列をNullに
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
For Each c In ActiveSheet.UsedRange
If c.Value = "" And Not IsNull(c) Then
c.ClearContents
End If
Next c
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
最初から、「長さ 0 の文字列」セルを一度に選択する方法があれば簡単なのですが、そのような方法はありますか?
あるいは他のもっとよい方法などがあればご教示くださいませ。
(o。_。)oペコッ
No.2ベストアンサー
- 回答日時:
>それをコピーしてくると...
とは?どんな手順ですか?
もし単純なコピーペーストだったら、それを[形式を選択して貼り付け]-[テキスト]で貼り付けても一緒でしょうか?
いずれにしても『'長さ0の文字列をNullに』する処理の別案。
【A】
With ActiveSheet.UsedRange
.Value = .Value
End With
(注意)
・データ範囲が多すぎると遅い。(もしくはメモリ不足エラーになる可能性も)
・1セル内文字列が1,824文字以上だと切り捨てられる。(2003の場合は912文字以上でエラー)
・セル表示形式が標準の場合、データによっては型が変わる。('0123が123に...表示形式設定が必要)
【B】
Dim x
With ActiveSheet.UsedRange
For Each x In Array(1, 3, 6)
.Columns(x).TextToColumns DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=False, _
Comma:=False, _
Space:=False, _
Other:=False, _
FieldInfo:=Array(1, 2)
Next
End With
列単位でTextToColumnsメソッドを使う。([データ]-[区切り位置]のことです)
必要な列のみ処理でき、引数FieldInfoでデータ形式も設定できます。
【C】
それと、別インスタンスでExcelを起動し、(Excel.exeを2つ起動する意味)
別エクセルに[形式を選択して貼り付け]-[テキスト]で貼り付ける事でも対処できるかと。
この場合1,824文字以上の切捨てはありません。(表示形式に留意必要)
必要であればマクロ対応もできるでしょう。
end-uさま、おせわになります。
どんな手順でアクセスからもってくるかはわたしは知らないのです。(わたしはアクセスにさわったこともありません)
With ActiveSheet.UsedRange
.Value = .Value
End With
試しました。一発でOKでした!
ただ、文字などの制限があるのですね。
【B】のFor Each x In Array(1, 3, 6)の1、3、6は何をさすのでしょうか?
これもそのままやってみしましたがEmptyにはなりませんでした。
No.7
- 回答日時:
>【B】のFor Each x In Array(1, 3, 6)の1、3、6は何をさすのでしょうか?
>これもそのままやってみしましたがEmptyにはなりませんでした。
あれ?そうですか。
まあ、いいです。そういう事もあるのかもしれません。
とりあえず『1、3、6は』.Columns(x)...という記述から推測できると思いますが
UsedRangeの列を指します。
対象列が限定されている場合などに使えるかな...程度で。
書き忘れてましたが、こちらは255文字で切り捨てられるんでした。(...使えんorz)
次に【C】の質疑がくるかもしれませんが、色々と盛りだくさんにしてもあれなのでそれはパスという事で。
#ちなみにcj_moverさんのSub NLS_Sweeper()は通常は問題なく機能します。
>VBEでは、.Range(sURAd).Formula = sFml の部分が黄色くなっていました。
問題はシート名のほうかと。その場合
"=1/(ISTEXT('" & .Name & "'!RC)*('" & .Name & "'!RC=""""))"
シングルクォーテーションでくくってあげれば良いです。
ありがとうございます。「1、3、6は何」などと馬鹿な質問をしてしまいました。すみません。
シート何で数式の表示が変わることも失念していました。
仰せのとおりでした。
ありがとうございます。
No.6
- 回答日時:
こんにちは。
>こんなセルがあるとEnd(xlUp)などで最終行を取得したい場合や、ワークシート関数でISBLANKやCOUNTAでは空白でないとされるのにCOUNTBLANKでは空白扱いされて、こまったことになってしまうのです。
既出の回答で、 .Value = .Value すでに解決策は出ているようですし、私自身は、申し訳ないけれども、テクニカル上のものは、ここで、あまりあれこれと出すつもりはありません。たぶん、間違いないという確信はあるものの、実際にやってみないと分からないです。
たぶん、「大山鳴動して鼠一匹」というところだと思います。
もともと、AccessからExcelへのインポート上の問題だろうし、実際に、何が入っているか、エスケープシーケンスなのか、NullCharなのか、それとも他のものなのか明らかになっていないし、基本的には、数式が入っているわけはないだろうし、入っているものが文字なら、一括置換でクリアになるはずです。
>End(xlUp)などで最終行を取得したい場合
Unicode 空白でも、エスケープシーケンスでも、何が入っているかは明らかにしたほうがよいのでは?複数入っていることもあるだろうから、
If c.Value = "" And Not IsEmpty(c) Then
この後で、AscW(c) で、調べたらよいと思います。また、Byte で調べても可能です。
ただし、JISのAsc(c) ですと、一律同じ文字コードになってしまう可能性があります。それが、どのような文字コードなのか、ヒットしたコードを、置換して空にすればよいと思います。
それなら、End プロパティで取れるようになれます。しかし、そうしなくても、おそらくは、Match関数で最終行は取れるはずです。
No.5
- 回答日時:
すみません。
#4の投稿が途切れてしまったので、再掲します。
Sub NLS_Sweeper()
Dim sh0 As Worksheet
Dim sFml As String, sURAd As String
With Application
.EnableEvents = False
.Calculation = xlCalculationManual
.ScreenUpdating = False
.DisplayAlerts = False
End With
Set sh0 = ActiveSheet '任意指定
With sh0
sURAd = .UsedRange.Address
sFml = "=1/(ISTEXT(" & .Name & "!RC)*(" & .Name & "!RC=""""))"
End With
With Worksheets.Add(sh0)
.Range(sURAd).Formula = sFml
sh0.Select False
On Error GoTo ln9
Cells.SpecialCells(xlCellTypeFormulas, xlNumbers).Select
Selection.ClearContents '任意
ln9: If Err.Number > 0 Then MsgBox "NLS_Areas_(Over_8192)_or_0"
On Error GoTo 0
.Delete
End With
Set sh0 = Nothing
With Application
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub
cj_moverさま、いつもまたありがとうございます。
やってみましたところ
実行時エラー1004「アプリケーション定義またはオブジェクト定義のエラーです」と出てしまいました。
VBEでは、.Range(sURAd).Formula = sFml の部分が黄色くなっていました。
sURAdには正しく $A$1:$B$2432 が代入されています。
sFmlにも"=1/(ISTEXT(~の数式が代入されています。
( ̄∇ ̄) ?
No.4
- 回答日時:
こんにちは。
よく解りませんが、長さ0の文字列、お嫌いなようですね。
「Excelにやらせる」タイプのマクロ(つまり手作業で可)
を一つのアイディアとして掲げてみます。
・.SpecialCells は領域数8192が上限です
・標準モジュール専用、自ブック専用、です
・他、特殊な状況は想定しません
課題からやや外れて、
表示形式=文字列に設定されたセルでも
長さ0の文字列を消せる
作業手順をコード化しました。
Sub NLS_Sweeper()
Dim sh0 As Worksheet
Dim sFml As String, sURAd As String
With Application
.EnableEvents = False
.Calculation = xlCalculationManual
.ScreenUpdating = False
.DisplayAlerts = False
End With
Set sh0 = ActiveSheet '任意指定
With sh0
sURAd = .UsedRange.Address
sFml = "=1/(ISTEXT(" & .Name & "!RC)*(" & .Name & "!RC=""""))"
End With
With Worksheets.Add(sh0)
.Range(sURAd).Formula = sFml
sh0.Select False
On Error GoTo ln9
Cells.SpecialCells(xlCellTypeFormulas, xlNumbers).Select
Selection.ClearContents '任意
ln9: If Err.Number > 0 The
No.3
- 回答日時:
こんばんは。
何もないのに、UsedRange やSpecialCells(xlCellTypeLastCell)で、最後尾のデータを探すと、空のセルを示していることがあります。これ自体は、Excelのマクロの最後尾を探すコードの問題で、それ以上の問題ではないはずです。
もし、削除したいのでしたら、列や行の削除になるはずですが、保存して、再起動して開ければなくなっているはずです。これは、セルを使った痕跡だと思います。そのままの状態では、無視するしかありません。ただし、書式が残っている場合は、それを消さないと最後尾は探せません。
再起動せずに、最後尾を探す場合は、マクロでは、End プロパティを使います。
ワークシート上のNull(本来の意味は、ゼロ) は、Excelでは何もないという意味ではなくて、エラー値のひとつで、指定した複数のセル範囲に共通部分がない時に出ます。VBAのNull 値は、バリアント型 (Variant) に有効なデータが入っていないことを示す値であり、変数が初期化されていないことを示しますが、Empty 値や、「Null 文字列」と呼ばれる「長さ0の文字列 ("")」 とは異なります。
ワークシートで、何もないのは、Empty です。検査する場合は、IsEmpty(c) です。「=""」Null文字を判定する場合は、If c.Value ="" And VarType(c) = vbString です。だから、ワークシートで、VBAのIsNull の判定は役に立ちません。
=AVERAGE( B1:B5 C2:C6 ) -->#NULL! (Nullエラー値)
>If c.Value = "" And Not IsNull(c) Then
ワークシートに該当する、VBAに該当するNull値は存在していません。
Wendy02さま、いつもおせわになります。
データが会社にあるもので、土日はためせませんでした。
> ワークシートで、VBAのIsNull の判定は役に立ちません。
仰せのとおりでした。IsNullでTRUEを返すセルはありませんでした。
If c.Value = "" And Not IsEmpty(c) Then で調べなければならなかったのですね。
質問も「エクセルVBA 長さ0の文字列をEmptyに」と書くべきだったのですね、すみません。
で、やはり「アクセスから取った」といわれて受け取ったデータではIf c.Value = "" And Not IsEmpty(c)がTRUEを返すセルが散見されました。
こんなセルがあるとEnd(xlUp)などで最終行を取得したい場合や、ワークシート関数でISBLANKやCOUNTAでは空白でないとされるのにCOUNTBLANKでは空白扱いされて、こまったことになってしまうのです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのセル内でタブキーの...
-
エクセルで空白のセルに自動で...
-
エクセルのグラフでデータテー...
-
エクセルのテーブルで自動拡張...
-
差込印刷での表示について
-
文字をアルファベット順に3つ...
-
エクセルで全波整流回路の波形
-
一般家庭でのエクセル利用法
-
エクセルマクロでセルの文字サ...
-
エクセルにアクセスカウンター...
-
エクセル シート内の別のセルに...
-
エクセルVBA 長さ0の文字列をNu...
-
HTML形式の表を、Excel形式に...
-
ウェブから貼ったドロップダウ...
-
エクセルにて指定文字数以上の...
-
エクセル 文字の先頭4文字だ...
-
エクセルの神よ、ご回答を! エ...
-
エクセル マクロ テキストファ...
-
エクセルで3Dの円錐形を作成...
-
入力した数字の数だけセルを塗...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのセル内でタブキーの...
-
エクセルで3Dの円錐形を作成...
-
エクセルのグラフでデータテー...
-
エクセルの神よ、ご回答を! エ...
-
差し込み印刷で文字化け!
-
エクセルオンラインのみ勝手に...
-
エクセルの変換
-
日報のデータを月報にデータを...
-
VBA初心者です。電話番号の数字...
-
エクセル 文字の先頭4文字だ...
-
文字をアルファベット順に3つ...
-
ウェブから貼ったドロップダウ...
-
エクセルマクロでセルの文字サ...
-
エクセルのセルが突然選択でき...
-
エクセルにて指定文字数以上の...
-
エクセルVBA 長さ0の文字列をNu...
-
特殊記号を一括で消去または置...
-
エクセル 三桁の数字をリンク...
-
文字を入力するだけで、強制終...
-
エクセル データ追加するもグ...
おすすめ情報