![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
エクセル2000です。
ある大きな表のうち、0値を非表示ではなく完全に削除するために以下のようなマクロを書いてみました。
一旦配列に取り込んでいるのは高速化のためです。
これで見た目には目的を達しているのですが、実際には0値が長さ0の文字列に変わっただけで完全な空白にはなっていません。
配列にとりこまず、セルをループして0値のセルをClearすれば解決するのはわかるのですが、ほかにいい方法はないでしょうか?
Sub TEST0値()
Dim myAr
With ActiveSheet
x = .Range("A" & Rows.Count).End(xlUp).Row
myAr = .Range("A4:AP" & x).Value
For i = LBound(myAr, 1) To UBound(myAr, 1)
For n = LBound(myAr, 2) To UBound(myAr, 2)
If myAr(i, n) = 0 Then myAr(i, n) = ""
Next n
Next i
.Range("A4:AP" & x).Value = myAr
End With
End Sub
No.9
- 回答日時:
こんにちは
以前、関連した質問に回答していたもので、気になりまして。
宿題の邪魔になってしまうかも知れませんが
やや混乱されてるようにお見受けしたので。
merlionXXさんが以前から気になさっていたのは
たしか、こういうことではなかったかと、、、
Sub test()
With Range("B2")
.NumberFormatLocal = "@"
.Value = ""
MsgBox [istext(b2)]
.Value = Empty
MsgBox [istext(b2)]
Dim Arr(0)
.Value = ""
MsgBox [istext(b2)]
.Value = Arr
MsgBox [istext(b2)]
End With
End Sub
これ、回答じゃなくて、遅ーい、夏のご挨拶ってことで(^^;)
この回答への補足
この質問とはちがいますが、昨年の10月に別件で
> ただ、Value = "" を使うと、セル書式が文字列になっている場合、完全な空白ではなくなるようで、ISBLANKがFALSEなのにCOUNTBLANKでは空白に数えられるという不整合がおきます。それでClearContentsするようにしています。
なんて、自分で書いているんですね!?
すっかり忘れていました。
その際にもcj_moverさまには大変お世話になり、ありがとうございました。
cj_moverさま、いつもありがとうございます。
な~るほどぉ~っ!
セル書式が文字列になっていると、VBAで Value = "" とすると、長さ0の文字列が入って空白にはならないんですね。
その点、Value = Empty なら、書式に関係なく大丈夫ということですね。
ありがとうございました。
これで安心して夏休み(明日から4連休!蓼科~軽井沢)がとれます!
No.8
- 回答日時:
こんにちは。
No.3,4,6です。> Microsoft Scripting Runtime を参照していない環境だと
> Dim myDic As Scripting.Dictionary がエラーになってしまいました。
処理を実行する前のコンパイルチェックで Scripting.Dictionary オブジェクトが見つからないからです。
ですから「これを使いますよ」って参照設定しておくのです。
> Dim myDic As Object だとエラーになりません。
処理を実行する前のコンパイルチェックでは、オブジェクトなら何でもいいと宣言しているのでエラーになりません。実行時の参照設定で WorkSheet が入ろうと、Scripting.Dictionary が入ろうともExcelは関知しないのです。
そして、処理が実行され、Set myDic = CreateObject("Scripting.Dictionary") の行にきて初めて "Scripting.Dictionary"オブジェクトを使うと分かり、Microsoft Scripting Runtime ライブラリを探してmyDicに参照設定します。
これが実行時バインディングというものです。その時点で Microsoft Scripting Runtime ライブラリが見つからない時は、エラーになります。
事務所で書類を作成している時に、必要な資料がなくて書庫に探しに行くようなものです。資料がなければ作業を中断せざるを得ません。
> 参照しない場合は Dim myDic As Object でやるしかないということですね。
そうなります。As Object のことは、CreateObject 関数のヘルプにきちんと書かれています。
ですが、Scripting.Dictionary を使おうとしていて、参照設定できる環境にあるのにあえて As Object と宣言して参照設定のメリットを享受しない理由が判りません。
処理を速くしたいと思ってコードを組んでいるのなら、参照設定してきちんとオブジェクトの型を宣言すべきと私は思います。
> そして、処理が実行され、Set myDic = CreateObject("Scripting.Dictionary") の行にきて初めて "Scripting.Dictionary"オブジェクトを使うと分かり、Microsoft Scripting Runtime ライブラリを探してmyDicに参照設定します。
なるほど、そういうことだったんですか。
そんなことも知らずに使っていました。
勉強になりました。
今回はわたしの勘違い質問でしたが、ずいぶん多くを学ぶことが出来ました。
OtenkiAmeさん、ありがとうございます。
皆様、ありがとうございます。
No.7
- 回答日時:
>みなさま大変おさがわせいたしました。
いえ、いえ、かまいませんよ。
お騒がせ大好きです。。。(^^;;;
ただ、ある条件のもとでは質問の件のように
""を代入することで、長さ0の文字列が入る場合があります。
で、当方の回答はそれを考慮しての回答でした。
要するに、未入力の状態にするということです。
さてさて、この【ある条件】とは何でしょう。
ま、これは夏休みの宿題、ということで。。。(^^;;;
以上です。
【ある条件】?
Sub Test1()
With Range("A1")
.Formula = "="""""
.Copy
.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End With
MsgBox IsEmpty(Range("A1"))
End Sub
ということではなく、配列で入れた場合の話ですよね?
何でしょう?!
夏休み終わってしまいました・・・・。
No.6
- 回答日時:
こんにちは。
No.3、No.4です。> これはどのような違いがあるのでしょうか?
> Newがついてるので何か違うのでしょうがわかりません。
Newキーワードは、オブジェクトのインスタンスを実際に作成させるために記述しています。
詳しいことは、VBAのヘルプファイルのCreateObject関数の項目とSetステートメントの項目をご一読いただくと良いかと思いますが、私の場合、もし使用するオブジェクトが分かっているなら、変数の宣言の段階でオブジェクトを宣言するようにしています。
これは、事前バイディングと実行時バインディングの違いによるもので、VBAを使い始めた頃に処理が高速になると教えられました。
例ですと
Dim myDic As Object
は、オブジェクトへの参照が実行されるまで何が入るか分からないですよね。
でも
Dim myDic As Scripting.Dictionary
なら、オブジェクトは明確に宣言されているので、処理が実行される前に変数の最適化が行われたり、コードを作成する時にオートメンバの機能などが使えます。
CreateObject関数を使うなら
Dim myDic As Scripting.Dictionary
Set myDic = CreateObject("Scripting.Dictionary")
として使用したほうが事前に変数が最適化されているので処理が速くなるということです。
高速な処理を目指すなら細かいことですけど、使用する変数は、型を含めてきちんと宣言しておくと良いと思います。
(少なくとも私はそうしています。)
ちなみに、CreateObject関数を使用するか、実際のオブジェクトを参照するかは、好みによるのかな?と思います。
「どちらが最適なのか」までは解説できる知識を持ち合わせていませんのであまり突っ込まないでくださいね。(^_^;)
ではでは。
なんどもありがとうございます。
> Dim myDic As Scripting.Dictionary
> Set myDic = CreateObject("Scripting.Dictionary")
> として使用したほうが
Microsoft Scripting Runtime を参照していない環境だと
Dim myDic As Scripting.Dictionary がエラーになってしまいました。
Dim myDic As Object だとエラーになりません。
参照しない場合はDim myDic As Object でやるしかないということですね?
No.5
- 回答日時:
んにちは。
>これで見た目には目的を達しているのですが、実際には0値が長さ0の文字列に変わっただけで完全な空白にはなっていません。
良く分からないですね。配列変数のVariant 型で、長さ0の文字列[""]であったとしても、
.Range("A4:AP" & x).Value = myAr
としたら、[""]をセルに代入したら、空になってしまうのでは?
例えば、Range("A1").Value = "" は、A1 は、空のはずです。
それとも、何か入っているのですか?
もし、セルに[""]を入れるなら、
Range("A1").Value = """"""
'-------------------------------------------
Sub EmptyTest1()
Range("A1").Value = ""
If IsEmpty(Range("A1")) Then
MsgBox "セルは空です。"
Else
MsgBox "何か残っています。"
End If
End Sub
'-------------------------------------------
わたしは何か、とんでもない勘違いをしていたようです。
計算結果で ="" になったセルを、コピーして値貼り付けした場合の現象が頭にあって、ためしもせずに質問してしまいました。
試したところWendy02さまのおっしゃる通りでした。
みなさま大変おさがわせいたしました。
ごめんなさい。
No.4
- 回答日時:
こんにちは。
No.3です。> 実際は0値のみならずさまざまな条件で空白にしたいので
それならDictionaryを使ってみては如何でしょうか?
'VBEのツール-参照設定で Microsoft Scripting RuntimeをチェックしてOK
Dim myAr As Variant
Dim x As Long, i As Long, n As Long
Dim myDic As Scripting.Dictionary
Set myDic = New Scripting.Dictionary
'辞書にKey(照合値)とItem(Keyと一致したときの要素)を追加
'例えば0,1,3,5を空にする
With myDic
.Add 0, Empty
.Add 1, Empty
.Add 3, Empty
.Add 5, Empty
End With
With ActiveSheet
x = .Range("A" & .Rows.Count).End(xlUp).Row
myAr = .Range("A4:AP" & x).Value
For i = LBound(myAr, 1) To UBound(myAr, 1)
For n = LBound(myAr, 2) To UBound(myAr, 2)
'辞書と照合してItem(ここではEmpty)を代入
If myDic.Exists(myAr(i, n)) Then myAr(i, n) = myDic(myAr(i, n))
Next n
Next i
.Range("A4:AP" & x).Value = myAr
End With
Set myDic = Nothing
ご丁寧にありがとうございます。
Dictionaryを使うことは思いもよりませんでした。
参考までに教えていただければ幸いですが、わたしがこれまで使ったことがあるDictionaryは、
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
のような記述ではじめるのですが、
Dim myDic As Scripting.Dictionary
Set myDic = New Scripting.Dictionary
これはどのような違いがあるのでしょうか?
Newがついてるので何か違うのでしょうがわかりません。
No.3
- 回答日時:
こんにちは。
置換したら如何でしょうか?
Dim x As Long
With ActiveSheet
x = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A4:AP" & x).Replace What:="0", Replacement:="", _
LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False
End With
ありがとうございます。
たしかに質問の例の通り0値だけが対象ならこれでいけますね。
ただ、実際は0値のみならずさまざまな条件で空白にしたいので配列に取り込んだのです。
言葉足らずでもうしわけありませんでした。
No.1
- 回答日時:
多分コードは組める方だと思うのでヒントだけ。
データを取り込んで、「取り込んだ範囲を".clear"」
あとは、データのある部分だけ書き込み、という方法は如何かと。
さっそくありがとうございます。
データのある部分だけ書き込み、とはこういうことでしょうか?
これだとやはり個々にセルに入れるので時間がかかってしまいます。
Sub TEST0値2()
Dim myAr
With ActiveSheet
x = .Range("A" & Rows.Count).End(xlUp).Row
myAr = .Range("A4:AP" & x).Value
.Range("A4:AP" & x).ClearContents
For i = LBound(myAr, 1) To UBound(myAr, 1)
For n = LBound(myAr, 2) To UBound(myAr, 2)
If myAr(i, n) <> 0 Then .Range("A4:AP" & x).Cells(i, n) = myAr(i, n)
Next n
Next i
End With
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
何回やってもうまくいかないことは?
みなさんには、何回やってもうまくいかないことはありますか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
一番好きなみそ汁の具材は?
みんなで大好きなみそ汁の具材について語り合おうよっ!
-
空白への0入力 二次元配列(VBA)
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
Excelのセルの色指定をVBAから配列を用いて効率的に行う方法はあり
Visual Basic(VBA)
-
5
配列でデータが入っている要素を求める方法
Visual Basic(VBA)
-
6
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
7
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
8
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
9
2つ以上の変数を比較して最大数を求めたい
Word(ワード)
-
10
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
11
VBAでEmpty値って何ですか?
Excel(エクセル)
-
12
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
13
配列を任意の数値で埋める方法
Visual Basic(VBA)
-
14
エクセルVBAで不一致に空白セルを挿入
Excel(エクセル)
-
15
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
16
VBAで配列の計算
Excel(エクセル)
-
17
split関数で区切り文字がない場合
Visual Basic(VBA)
-
18
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
19
VBAでオプションボタンによってコンボボックスの内容を変える方法
Visual Basic(VBA)
-
20
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
実行時エラー 3265「要求された...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
オブジェクトが見つかりません
-
[VBA]CDOメッセージ送信エラー
-
オブジェクト変数の取得について
-
ADO 「NEW」の意味、必要性
-
Excelでフィルタをかけると警告...
-
vbsのFolderExistsで部分一致を...
-
Excel VBAでIEにアクセスするプ...
-
Excel VBAでWordの複数ファイル...
-
【VB】【エクセル操作】 SaveAs...
-
ユーザー定義関数について
-
VBAで既に開いている別アプリケ...
-
VBScriptからDLL参照設定したい
-
CreateObjectとGetObjectの違い
-
コンパイルエラーの対処がわか...
-
VBAについてです。 初心者です...
-
VBAで別のシートに図形描画
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
VBAで既に開いている別アプリケ...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
上下の位置揃えについて
-
エクセルマクロエラー「'Cells'...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルVBAでcode128のバー...
-
テキストボックス中の文字列の...
-
EXCEL VBA オートシェイプナン...
-
AccessVBAで「dim dbs as datab...
-
findメソッドの変数について
-
ある文字列が全て数字であるか...
-
VBAからPDFファイルにパスワー...
-
VBScriptでファイルの日時順(降...
-
エクセルVBAで配列内に空白デー...
-
PowerPointVBAでスライドマスタ...
-
VBAで作成するメール(開封確認...
おすすめ情報