4月17日はQueenの日!フレディ・マーキュリーの年代別ファッション&ヒットソングまとめ

Sub sample2()
Dim rng8 As Range
Set rng8 = Range("B2:E4")
rng8(3).Interior.ColorIndex = 5
With rng8
.(3).Interior.ColorIndex = 5
End With
End Sub

上記で 
rng8(3).Interior.ColorIndex = 5
は問題無く機能しますが、

withステートメントの
.(3).Interior.ColorIndex = 5
は修飾子なんたらのエラーになります。

どのように書けば宜しいのでしょうか。

勿論、
With rng8(3)
.Interior.ColorIndex = 5
End With
とやれば出来るのですが、
(3)の部分を色々変更したいのです。

宜しくお願いします。

A 回答 (3件)

>なぜ、 .(3).interior.coloerindex = 5


>がコーディング上のエラーになるのかということです。

端的にいうなら、配下のプロパティがないから、ということでしょうけれども、正直な話ですが、インテリセンスによって導かれるだけなのです。(インテリセンスというのは、VBA Editor 上で、オブジェクトの後にプロパティやメソッドの一覧が出てくる入力補助機能のこと)

With Rng8
.(この後に、何が続くのかインテリセンスで探してみる)

と[. ピリオド]を入れたあと、もしくは.(3)と入れた後に、その配下に何らかのプロパティが続いてくれるなら書けるけれども、そうならないので、駄目なのだなっていうことが分かるのです。理屈とか理由とかではなく、VBAの癖のようなものだと理解しています。

それでは、
Rng8(3).Interior.ColorIndex =5 と書けるのだから、

With Rng8
(3).Interior......

はどうかということでしょうけれど、上位オブジェクトのつながりを持たないで書いたところで、いきなり(3)では、上位オブジェクトをつないでないので、これは駄目だなって分かります。もともと、Rng8(3)は、Rng8.Item(3).Interior..... のItemが省略されているわけなのですから、それを戻してあげればよいということです。VBAにはいくつか省略型の書き方がありますが、それをまったく知らないで書いている人もいるようです。例えば、Range("A1") で、.Valueプロパティを書かないで書いてしまうとか。

実際、私は、書く時は、習慣的なものでしかありません。
    • good
    • 0
この回答へのお礼

再度、有り難うございました。
まず、私の質問の意図を完璧に理解いただき嬉しく思いました。
次ぎに、ご説明頂いた内容が良く理解出来ました。
本件では、Rng8.Item(3).Interior.....がオーソドックスな形だったのですね。
ご指摘のとおり、私は何も知らずに見よう見まねで書いています。
ただ、「Range("A1") で、.Value」については昔はそうでしたが、今はvalueは必ず入れています。
本回答を頂いたことでスッカリもやもやが晴れました。
かつ勉強になりました。
長々とお手間を掛けさせましたが深謝です。
お世話になりました。

お礼日時:2019/04/22 06:27

B2:E4 は、12セルあるわけで、その「3番目」なんて、どこのセルなんて分かりますか?



With rng8
   .Item(3).Interior.ColorIndex = 5
End With

このようには書けますが、ふつうは、一行や一列で行うので、複数行・複数列の場合は、あえて書く場合は、Cells プロパティを使います。
1行目の3列目という意味で、このように書きます。

   .Cells(1, 3).Interior.ColorIndex = 5
    • good
    • 0
この回答へのお礼

早速有り難うございました。
回避方法が分かったので直接の解決にはなりましたが、
(質問の仕方が悪かったのですが)
聞きたかったことは、
なぜ、 .(3).interior.coloerindex = 5
がコーディング上のエラーになるのかということです。
コレについて教えていただけると助かります。
宜しくお願いします。

お礼日時:2019/04/21 17:55

With mg8(i)などとなればいいだけでは。

    • good
    • 0
この回答へのお礼

折角回答を頂きましたが、
分かりません。
有り難うございました。

お礼日時:2019/04/21 17:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qマクロ無しで時間自動で記入をしていきたい

すごく贅沢な話なのですが・・・
マクロを使わず、通常のエクセルで時間を手入力でなく何かしらしたら(例:「1」と入力)自動で別セルに現在時刻ほ記載してくれる

マクロだと下記のような内容でやってます(一部)
Range("H3:K33").Select
Selection.Copy
Sheets("結果").Select
Range("A4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

マクロを使わずやれる方法はないでしょうか・・・

Aベストアンサー

論より 証拠、

作ってみました。


式、
=TEXT(IF(ISBLANK(B1),IF(ISBLANK(A10),B10,TODAY()),"此処が 変わります。"),"rr/mm/dd hh:mm")

ファイル、
https://1drv.ms/x/s!AjviygfJDgV_3GnS4Ko-q3mWU9fP

尚、
ファイルは 1度、
ローカルに 別名保存して、
其の保存ファイルを 扱うように、
してくださいね、

別名保存でないと、
意味が 無いですよ。


さすれば、
閲覧も、編集も、
叶うものと 思いますよ。

QCSVで文字化けしてしまうのを直すマクロ

いつもお世話になっております。
Excel2013を使用していますので
アドバイスどうぞよろしくお願いします。

"ファイル名"というシートのA列2行目からCSVファイルのファイル名が書いてあります。
日によるのですが、だいたい5~10件程度です。
そしてこのCSVファイルがくせ者でファイルを開くと文字化けを起こしてしまいます。下記のサイトを参考にマクロを作ったのですが、文字化けはしないものの文字に必ず""がついてしまい、また一行しか転記されません。

http://officetanaka.net/excel/vba/file/file10.htm

例 空白→""、 神奈川→"神奈川"

やりたいこととしてはファイル名とあるシートのA列2行目に書いてあるCSVファイルを開き、文字化けを直してSheet1にデータを表示させ、それをファイル名が書いてある最終行まで行いたいです。

Sub macro()
Dim i1 As Long, x As Long
Rbook As Workbook
Rsheet As Worksheet, Ssheet As Worksheet
Set Rbook = ThisWorkbook

Sheets("ファイル名").Select
Set Rsheet = Rbook.Worksheets("ファイル名")
For i1 = 2 To 10
If Rsheet.Cells(i1, 1).Value <> "" Then
Sheets("SHEET1").Select ’表示させるシート
Set Ssheet = Rbook.Worksheets("SHEET1")
Ssheet.Cells.Clear
Ssheet.Range("A1").Select

’文字化けを直す
Dim buf As String, Target As String, i1 As Long
Dim tmp As Variant, j As Long
Target = "¥アドレス" & Ssheet.Cells(i, 1).Value
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile Target
Do Until .EOS
buf = .ReadText(-2)
i = i + 1
tmp = Split(buf, ",")
For j = 0 To UBound(tmp)
Cells(i, j + 1) = tmp(j)
Next j
Loop
.Close
End With

’別のマクロ実行

End if
Next i1

’2行目、3行目と続く

End Sub

どうぞよろしくお願い致します。

いつもお世話になっております。
Excel2013を使用していますので
アドバイスどうぞよろしくお願いします。

"ファイル名"というシートのA列2行目からCSVファイルのファイル名が書いてあります。
日によるのですが、だいたい5~10件程度です。
そしてこのCSVファイルがくせ者でファイルを開くと文字化けを起こしてしまいます。下記のサイトを参考にマクロを作ったのですが、文字化けはしないものの文字に必ず""がついてしまい、また一行しか転記されません。

http://officetanaka.net/excel/vba/file/fil...続きを読む

Aベストアンサー

こんにちは。

>そのあと"buf = .ReadText(-2)"で止まり
>"パラメーターが間違っています"と表示されてしまいます。。。
>アドバイスどうぞよろしくお願いします。

ご指摘の部分は、残念ですが、想定外の問題で、ADODBを使って別のやり方はありますが、そのデータ自体の問題であり、原因は分からないままにコードを変えて何度も繰り返す可能性のほうが高いです。別のファイルでも、2番めに同じように起こりますか?

   Next j
  Loop
  .Close
 End With
 Set Strm = Nothing '←は入れたらどうでしょうか。
End Sub '←ここが最後の行

それと、私は、参照設定で、Adodb を入れていること。(Microsoft ActiveX Data Objects 2.8 Library)
Dim Strm As ADODB.Stream

これらは、あまり関係ないけれども、実際に自分がする時はこうします。もちろん、ご質問者さんが選んだ方法を完動するように書き上げただけですから、この延長上に、同様のエラーがなくなるという可能性は低いのではないかと思います。

今、思いついたのは、Excel 関数のClean 関数を間に入れる方法はあるとは思います。
それは、エラーを起こすと予想されるバイナリコードを除去する働きがあります。ただし、エラーがバイナリコードであれば、という条件です。

しかし、こちら側では、根本的な解決策は見当たりません。が、何度もトライするよりも、ダメだったファイルが、どうしてだめだったか、エディターなどで調べていただいたほうが良いですね。そちらのほうが早いのです。
巨大なファイルではない限りは、文字変換で、UTF-8 から、SJISに変換するツールで、一旦変更してから、インポートするほうが楽だと思います。Vector で、Unix系のツールなどいくつかあるようです。

こんにちは。

>そのあと"buf = .ReadText(-2)"で止まり
>"パラメーターが間違っています"と表示されてしまいます。。。
>アドバイスどうぞよろしくお願いします。

ご指摘の部分は、残念ですが、想定外の問題で、ADODBを使って別のやり方はありますが、そのデータ自体の問題であり、原因は分からないままにコードを変えて何度も繰り返す可能性のほうが高いです。別のファイルでも、2番めに同じように起こりますか?

   Next j
  Loop
  .Close
 End With
 Set Strm = Nothing '←は入れたらどうでし...続きを読む

Qパソコンに入っている文字

パソコン内に入っている文字を
B列にCDEFGはその文字にした場合のサンプルを書き出す
BVAを教えていただけないでしょうか。
バージョンは2013と2016で動くコードでお願いします。

Aベストアンサー

こういうのがあるみたいです。
ご希望に沿うかはわかりませんが。

http://tancro.e-central.tv/grandmaster/excel/tips-fontlist.html

Q20万を 超える、連番の 生成。

お世話になります。


「,」や、「;」で、
区切られた、
定数配列や、配列数式上の、
等差連番数値を 20万個以上、

VBAを 使わず、
生成したいのですが、

何か 良い方法は、
ありますでしょうか?


宜しく お願いします。

Aベストアンサー

こんにちは

シートやセルは利用しても良いものと解釈しました。
ひとまず、20万行を超えられる、行数の方を利用する方法で考えてみました。

まず、必要となる等差数列をROW()に基づいた式として表します。
(例えば、 =ROW()*2-1 1,3,5…の等差数列)
この式をコピーしておいて、シートのA列全体を選択した状態で、ペーストします。
この結果、A1、A2…に1、3、5…と最終行まで表示されます。

単純な式でできないような内容でも、A列を利用してさらに関数式で値を作成することも可能でしょう。
例えば、B1セルに =A1*2 として、セルの右下をダブルクリックすれば最終行まで式がコピーされます。


配列数式等で利用する場合には、A:Aあるいは必要な範囲を切り取って参照することで、そのまま多行1列の配列として利用できると思います。
1行多列の場合も同じ方法で作成可能ではありますが、エクセルのシートは2万列もないため、残念ながら20万には程遠い数にしかなりません。

試してはいませんが、前記の多行1列の配列をTRANSPOSEで行・列の反転をさせることで、1行多列のお求めの内容にも変換することができるものと考えます。


※ そもそも20万超の要素の配列数式を、エクセルがどのくらいで計算できるのかに不安を感じますが・・・

こんにちは

シートやセルは利用しても良いものと解釈しました。
ひとまず、20万行を超えられる、行数の方を利用する方法で考えてみました。

まず、必要となる等差数列をROW()に基づいた式として表します。
(例えば、 =ROW()*2-1 1,3,5…の等差数列)
この式をコピーしておいて、シートのA列全体を選択した状態で、ペーストします。
この結果、A1、A2…に1、3、5…と最終行まで表示されます。

単純な式でできないような内容でも、A列を利用してさらに関数式で値を作成することも可能でしょう。
例えば、B1セル...続きを読む

QIF関数とMODで、例えば入れた数値の倍数の時に◯が表示される……という数式を作りましたが、1.1の

IF関数とMODで、例えば入れた数値の倍数の時に◯が表示される……という数式を作りましたが、1.1の時に本当だったら1.1、2.2、3.3、4.4、5.5、6.6、7.7……で◯になるはずなのですが、10以下の数値を入れてみると、3.3、5.5、6.6、7.7、9.9は◯の表示がでてきません。
1.1、2.2、4.4、8.8しか◯が出ません。
どうしてでしょうか?

Aベストアンサー

幼稚な言い方だけど、Excel(に限らないので、PC全般的なことと理解してネ)は“小数点の計算には弱い”と理解しておきませう。
理屈っぽい人はフドーショースーテン(浮動小数点)問題などど言い始めますが・・・
それはさておき、対策を教えます。カンタンなことで、小数点抜きの整数に換算して、Excel に計算させることです。
貴方が提示した式(実はナッチョランでしたが)、を
=IF(MOD($A2*10,B$1*10)=0,"◯","")
に変更するだけで解決します。ゴチャゴチャ考えずに先ずは実行してみること!
どうなりましたか?

QVBAのエラーについて、”実行時エラー424オブジェクトが必要です”

gooで初めて質問します、VBAのエラーについて。

エクセルのシートにActiveXのチェックボックスを挿入しマクロを
作ろうと試みています。VBAの知識がないので、サンプルを
ダウンロードして作ろうと思っています。ところが、ダウンロードした
サンプルを動作させると、”実行時エラー424オブジェクトが必要です”
というメッセージがでます。どこを修正すればよろしいでしょうか?
エクセル2007を使用しています。よろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub checkbox()
Dim コントロール As Control
Dim チェック状態 As Boolean
チェック状態 = False
For Each コントロール In Controls '質問者記入:エラーメッセージがでる。
If TypeName(コントロール) = "CheckBox" Then
If コントロール.Value = True Then
チェック状態 = True
Exit For
End If
End If
Next
If チェック状態 = False Then
MsgBox "選択されていません。"
Exit Sub
End If
End Sub

gooで初めて質問します、VBAのエラーについて。

エクセルのシートにActiveXのチェックボックスを挿入しマクロを
作ろうと試みています。VBAの知識がないので、サンプルを
ダウンロードして作ろうと思っています。ところが、ダウンロードした
サンプルを動作させると、”実行時エラー424オブジェクトが必要です”
というメッセージがでます。どこを修正すればよろしいでしょうか?
エクセル2007を使用しています。よろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー...続きを読む

Aベストアンサー

私も大して分かってないのですみませんが、ご提示されたWebのサンプルコードは、「ユーザーフォーム」の上に作ったチェックボックス用かなにかのコードのようです。
シート上に作った「「ActiveXコントロールのチェックボックス」の場合は、同じチェックボックスでも少し勝手が異なるみたいです。

a:変数「コントロール」の宣言が、「Dim コントロール As OLEObject」になる。
(=「Control」型ではなく、「OLEObject型」になるみたいです。)
b:「Cntrols」が「Worksheets("sheet1").OLEObjects」になる。
c:「コントロール」や「コントロール.Value」に「Object.」がくっつく。
・・・という感じで・・・。

少し作り変えてしまいましたが、以下のコードを試すとどうなりますでしょうか?
「Sheet1」の上に作ったチェックボックスを調べていくコードです。
(たぶん、動くと思うんですけど・・・。動かなかったらごめんなさい!)

※もし「Shhet1」が作ってなければ、「Sheet1」を作って、その上に、ActiveXコントロールの「チェックボックスを2、3個、作って、実行してみてください。


'#################################################################
'チェックボックスが「ActiveXコントロール」の場合
'#################################################################

Sub checkbox02()

Dim コントロール As OLEObject
Dim チェック状態 As Boolean
Dim s_CtlName As String

チェック状態 = False


For Each コントロール In Worksheets("sheet1").OLEObjects

If TypeName(コントロール.Object) = "CheckBox" Then
If コントロール.Object.Value = True Then
チェック状態 = True
s_CtlName = コントロール.Name
Exit For
End If
End If

Next


If チェック状態 = True Then
MsgBox s_CtlName & "にチェックが入っているっぽいです。"
ElseIf チェック状態 = False Then
MsgBox "選択されていません。"
Exit Sub
End If

End Sub




ちなみにですが、チェックボックスが「フォームコントロール」のほうで作られていると、以下のような感じのようです。

d:変数「コントロール」の宣言が、「Dim コントロール As checkbox」になる。
(=「Control」型ではなく、「checkbox型」になるみたいです。)
e:「Cntrols」が「Worksheets("sheet1").CheckBoxes」になる。
f:「コントロール.Value = True」が「コントロール.Value = 1」など、数値での判別になる。
・・・という感じで・・・。

※「Sheet1」上に、「フォームコントロール」の「チェックボックスを2、3個、作って、実行してみてください。


'#################################################################
'チェックボックスが「フォームコントロール」の場合
'#################################################################

Sub checkbox03()

Dim コントロール As checkbox
Dim チェック状態 As Boolean
Dim s_CtlName As String

チェック状態 = False


For Each コントロール In Worksheets("sheet1").CheckBoxes

If TypeName(コントロール) = "CheckBox" Then
If コントロール.Value = 1 Then 'チェックONだと「1」、OFFだと「-4146」です。
チェック状態 = True
s_CtlName = コントロール.Name
Exit For
End If
End If

Next


If チェック状態 = True Then
MsgBox s_CtlName & "にチェックが入っているっぽいです。"
ElseIf チェック状態 = False Then
MsgBox "選択されていません。"
Exit Sub
End If

End Sub

私も大して分かってないのですみませんが、ご提示されたWebのサンプルコードは、「ユーザーフォーム」の上に作ったチェックボックス用かなにかのコードのようです。
シート上に作った「「ActiveXコントロールのチェックボックス」の場合は、同じチェックボックスでも少し勝手が異なるみたいです。

a:変数「コントロール」の宣言が、「Dim コントロール As OLEObject」になる。
(=「Control」型ではなく、「OLEObject型」になるみたいです。)
b:「Cntrols」が「Worksheets("sheet1").OLEObjects」になる。
c:「...続きを読む

Q保存先フォルダとファイル名について

いつもお世話になっております。
保存をかける際にダイアログボックスを出したく、
またシートA1には保存先、B1にはファイル名を指定しておきたいのですが
どのようにすればよろしいでしょうか?
色々調べたのですが解決できず、アドレスどうぞよろしくお願いします。

ちなみにEXCEL2013を使用しています。

Sub CsvExportWithQuotation()
 Dim FileName As Variant
 Dim Rng As Range
 Dim LastCell As Range
 Dim c As Range
 Dim i As Long
 Dim strLine As String, fname As String, fpath As String

fpath = cells(1,1).value
fname = cells(1,2).value
 FileName = Application.GetSaveAsFilename( fpath & "¥" & fname,fileFilter:="CSVt Files (*.csv), *.csv")

保存先は指定出来るのですが、ファイル名が表示されません。
何卒よろしくお願い致します。

いつもお世話になっております。
保存をかける際にダイアログボックスを出したく、
またシートA1には保存先、B1にはファイル名を指定しておきたいのですが
どのようにすればよろしいでしょうか?
色々調べたのですが解決できず、アドレスどうぞよろしくお願いします。

ちなみにEXCEL2013を使用しています。

Sub CsvExportWithQuotation()
 Dim FileName As Variant
 Dim Rng As Range
 Dim LastCell As Range
 Dim c As Range
 Dim i As Long
 Dim strLine As String, fname As String, fp...続きを読む

Aベストアンサー

No1です。

>セルではなく直接書いてみたのですが
>ファイル名はFALSE.csv と表示がされました。
ご提示の通りの式を与えれば、そうなります。

第一引数をファイル名と解釈して評価しようとしますので、
> InitialFilename = "保存先&ファイル名"
 1)まず式をそのまま評価すると False(論理値)となり
 2)要求されているのは文字列なので、変換した"FALSE"を値として採用
 3)拡張子「.csv」が付け加えられて
 4)ダイアログのファイル名欄に「FALSE.csv」と表示
という処理がなされているものと思います。

>セルに関数も入っていないのに謎です
セルの値を参照していないのであれば、セルの状態がどうであるかは関係ないはずです。
(関係したら、その方がおかしい)

Q[Excel,VBA,VBE] VBE上で構文,定型文の貼り付けを完結させたい

お世話になります。

VBEの右クリックに「よく使う構文の貼り付け」を追加したいと考えています。

例:右クリックメニューから"for文"→"終端セルまで"で以下の文を張り付ける
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

next i
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

"選択範囲のコメントアウト"を追加したり、Excel側の右クリックにマクロを登録する等の方法は検索したら出てきたのですが、表題の件は見つけられませんでした。

現状、直接記入するかメモ帳から貼り付けていますが少し不便を感じています
ご存知の方がいらしたら、ぜひ教えて頂きたいですm_m

補足質問(こちらは回答不要です)
VBEのショートカットに"選択の開始"は登録出来ないでしょうか
Shiftキーとの併用で任意の範囲選択が出来ることは存じていますが、Shiftキー押しっぱなしでは運指が辛い時があります

お世話になります。

VBEの右クリックに「よく使う構文の貼り付け」を追加したいと考えています。

例:右クリックメニューから"for文"→"終端セルまで"で以下の文を張り付ける
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

next i
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

"選択範囲のコメントアウト"を追加したり、Excel側...続きを読む

Aベストアンサー

こんにちは。

× for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

○ For i = 2 to Cells(Rows.Count,1).end(xlUp).Row

ご希望に叶うかは分かりませんが、個人的なことですが、ちょうど、この件について、その貼り付けするツールの作者とのやり取りをこの間までしていたばかりです。

右クリックメニューでは、知りませんが、Ctrl + Shift + R のショートカットキーで、以下を登録してあります。
Lastrow=Cells(Rows.Count,1).End(xlUp).Row
これらのコード(テンプレート)は、40項目ぐらい登録しています。

ツールの名前は、「MZ-Tools」 といいます。MZは、マジンガーZの略だそうです。
VBAのみならず、VSでも使用できる、世界的に有名なツールのひとつです。

解説は以下で出ています。
https://www.ka-net.org/blog/?p=6260

現在は、Ver.8 で、$79.5 で、日本語対応もしていませんので、日本では、あまり一般的には購入されないとは思います。それでも、かつてVer.3 (フリー)は、皆の知られたツールでした。Ver.3 は、同じ機能はありましたから、ウィルスさえ気をつければ、本家にはありませんが、探せば見つかるかと思います。
https://www.mztools.com/index.aspx

なお、その昔は、VSSという、MSのディベロッパーバージョンの中にあったのですが、これはデータベース状にしてしまい、後がとても使いづらかったです。MZ-Tools には、ショートカットキーとは別に、お好みコード・エレメントという機能もついています。

こんにちは。

× for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

○ For i = 2 to Cells(Rows.Count,1).end(xlUp).Row

ご希望に叶うかは分かりませんが、個人的なことですが、ちょうど、この件について、その貼り付けするツールの作者とのやり取りをこの間までしていたばかりです。

右クリックメニューでは、知りませんが、Ctrl + Shift + R のショートカットキーで、以下を登録してあります。
Lastrow=Cells(Rows.Count,1).End(xlUp).Row
これらのコード(テンプレート)は、40項目ぐらい登録し...続きを読む

QWクリックのイベントで、わからないのです。先輩方お救い下さい。

何度もすみません。もう一度お救い下さい

Wクリックで、文字を切り替えるコードで、セルの文字を切り替えることが容易になったのですが、これまでのように対象のセル以外は、Wクリックで、セルの編集(文字入力)がしたいのですが、可能でしょうか。


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Cancel = True
 If Intersect(Target, Range("B1:B10")) Is Nothing Then Exit Sub
 With Target
  If .Value = "■" Then
   .Font.Name = "MS ゴシック"
   .Value = "□"
  ElseIf .Value = "□" Then
   .Font.Name = "Wingdings 2"
   .Value = "P"
  ElseIf .Value = "P" Then
   .Font.Name = "MS ゴシック"
   .Value = "■"
  Else 'それ以外の文字や空白の時
   .Font.Name = "MS ゴシック"
   .Value = "■"
  End If
 End With
End Sub

何度もすみません。もう一度お救い下さい

Wクリックで、文字を切り替えるコードで、セルの文字を切り替えることが容易になったのですが、これまでのように対象のセル以外は、Wクリックで、セルの編集(文字入力)がしたいのですが、可能でしょうか。


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Cancel = True
 If Intersect(Target, Range("B1:B10")) Is Nothing Then Exit Sub
 With Target
  If .Value = "■" Then
   .Font.Name = "MS ゴシ...続きを読む

Aベストアンサー

対象外だったら処理終了で抜ける。
その後、イベントをキャンセルして処理に入るようにします。

Cancel = True
If Intersect(Target, Range("B1:B10")) Is Nothing Then Exit Sub
 ↓
If Intersect(Target, Range("B1:B10")) Is Nothing Then Exit Sub
Cancel = True

Qユーザーフォームが消えない

今、ユーザーフォームを勉強しています。
手始めに、ラベルを表示して、2秒経ったら消す。
ということをやろうとして下記の通り書きましたが、
消えてくれません。
何処が間違っているのでしょうか。
宜しくお願いします。

Sub test2()
Load UserForm1
UserForm1.Label1.Caption = "ABC"
UserForm1.Show
Sleep 2000
UserForm1.Hide
Unload UserForm1
End Sub

Aベストアンサー

難しい質問ですね。
ご自身で参考にしたコードがあるのでしょうか。
ModalMode に関しては、なんとも言えないのは、UserForm 上で、Lable に命令を出しているからです。
それがなければ、後は補填するだけで済みます。
なお、Sleep を使っていらっしゃるようですが、Sleep 自体は、Win API ですから、もちろん、エラーが出ているはずです。

Load UserForm1
UserForm1.Label1.Caption = "ABC"
UserForm1.Show
Sleep 2000 --ここまでで、UserForm のメモリが安定しないので、Label の操作ができないのではないでしょうか。

ふつう、自己消去型のメッセージは、Win API を利用するのですが、UserForm を活かすなら、

Sub test2()
 Application.OnTime Now + TimeSerial(0, 0, 2), "UserFormColse"
 With UserForm1
  .Label1.Caption = "ABC" 'マクロが一定の終了をしないと出てこない
  .Show 'vbModeless 'この場合は、どちらでもよい。
 End With
End Sub

Sub UserFormColse()
 Unload UserForm1
End Sub

Label.Caption ="ABC" がなければ、問題はSleep の部分と余分な部分を切り落とすだけです。
こんなふうにしか私は思いつかなかったです。

その代用品として、このようなコードがあります。
Private Declare Function MessageBoxTimeoutA Lib "user32" (ByVal hWnd As Long, ByVal _
lpText As String, ByVal lpCaption As String, ByVal uType As Long, ByVal _
wLanguageId As Long, ByVal dwMilliseconds As Long) As Long

Sub TimeOutMessage()
MessageBoxTimeoutA 0&, "ABC", "メッセージ", vbMsgBoxSetForeground, 0, 2000 '2秒
End Sub

参考まで。

難しい質問ですね。
ご自身で参考にしたコードがあるのでしょうか。
ModalMode に関しては、なんとも言えないのは、UserForm 上で、Lable に命令を出しているからです。
それがなければ、後は補填するだけで済みます。
なお、Sleep を使っていらっしゃるようですが、Sleep 自体は、Win API ですから、もちろん、エラーが出ているはずです。

Load UserForm1
UserForm1.Label1.Caption = "ABC"
UserForm1.Show
Sleep 2000 --ここまでで、UserForm のメモリが安定しないので、Label の操作ができないのではないでし...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

価格.com 格安SIM 料金比較