- ベストアンサー
エクセルVBAでUsedRange内の可視セルを指定する方法
- エクセルVBAを使用して、UsedRange内の可視セルを指定する方法について教えてください。
- また、ロックされていないセルに対してデータをクリアする方法も教えていただきたいです。
- 上記のコードを使用しているのですが、SpecialCellsのところでコンパイルエラーが発生してしまいます。どのように修正すれば良いでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- ExcelのVBA動作中の再計算禁止について
ワークシート上に多数のチェックボックスを設置し、 一括管理のために簡単なVBAを記述しました。 Sub チェックボックス一括TRUE() With Application .ScreenUpdating = False .Calculation = xlCalculationManual CheckBoxes.Value = True .Calculation = xlCalculationAutomatic End With End Sub これだと瞬間で処理が完了するのですが、当初は .Calculation = xlCalculationManual .Calculation = xlCalculationAutomatic の二行をそれぞれ EnableCalculation = False EnableCalculation = True としていて、これは相当遅くなります(後者が遅い)。 速度の違いから両社は明らかに異なる動作をしていると思いますが、 調べてはみたものの自分にはそれぞれの処理の意味がよく理解できていません。 どなたかご教授いただければ。
- ベストアンサー
- Excel(エクセル)
- Excel VBA AutoFit の制約について
お世話になります。 Excel2010(Windows7) VBA にて、セル幅が自動調整 されず表示が「###」のままの場合があるのですが、 Cells.Select: Cells.EntireColumn.AutoFit 実行において何か成約事項等ございますでしょうか? また、次のコードを使用した場合も、自動調整されない 場合もありました(殆どは自動調整されるのですが)。 その際は(記憶が曖昧ですが)「.EnableEvents = False」 をコメントアウトすると自動調整されました。 同一Bookの中でも、ルーチンによって動きが異なります。 With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual End With ・・・ Cells.Select Cells.EntireColumn.AutoFit ・・・ With Application .ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic End With 情報不足で申し訳ございませんが よろしくお願い申し上げます。
- ベストアンサー
- Visual Basic
- エクセルVBA 長さ0の文字列をNullに
エクセル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ペコッ
- ベストアンサー
- その他MS Office製品
- excel 2003でCSVファイルを読み込むVBA
現在CSVファイルを読み込むマクロを作成してますが、レベルが低く下記載のコードで作業を行ってます。 皆様の技術をお借りしたいので、ご教授宜しくお願い致します。 ※現在のコードです。 CommandButton1でフォルダーを開いてcsvファイルを選択し、toolをsheetに追加してます。それから、CommandButton3で追加されたtoolからB14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付けています。 結構手間が係り作業に時間がかかってしまいます。 そこで、改良をしたいと思いますのでご教授お願い致します。 ※改良したいポイント (1)同じフォルダー内のTOOL.CSVをフォルダーを開かず直接commandButton1でSheetに追加する。 (2)Sheet2にコピーされたデーターから(B14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付ける。 (commandButton3はなくしたいと思ってます) 以上です。 宜しくお願い致します。 --------------------------------------------------------- Private Sub CommandButton1_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Myname = ActiveWorkbook.Name CSV_Filename = Application.GetOpenFilename("CSVファイル(*.CSV;*.prn),*.CSV;*.prn", , "CSVファイルを開く") If CSV_Filename = False Then Exit Sub Workbooks.Open CSV_Filename CSV_SheetName = Worksheets(1).Name Sheets(CSV_SheetName).Move after:=Workbooks(Myname).Sheets(Sheets.Count + 1) Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub ---------------------------------------------------------------- Private Sub CommandButton3_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Sheets("(TOOL)").Select Sheets("(TOOL)").Range("B14:C14").Select Sheets("(TOOL)").Range(Selection, Selection.End(xlDown)).Select Selection.copy Sheets("CSV Road").Select Sheets("CSV Road").Range("B12").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub -------------------------------------------------------------
- 締切済み
- オフィス系ソフト
- VBA 数式の計算が止まらない
下記マクロはE列に1~10を記入し、G列に数式で2倍して記入するものです。 数式の計算を事前に止めてる筈ですが、ステップモードで実行し確認すると、全部計算されてます。 Application.Calculation = xlCalculationManual これが効いてないないのです。 なぜでしょうか? Sub Macro1() For i = 1 To 10 Cells(i, "E") = i Next i Application.Calculation = xlCalculationManual For i = 1 To 10 Cells(i, "G").Formula = "=E" & i & "*2" Next i Application.Calculation = xlCalculationAutomatic End Sub
- ベストアンサー
- Excel(エクセル)
- エクセルVBAでLockされてないセルをClearContents
エクセル2000です。 シートでロックされていないセルだけ中身を削除するマクロを作っています。以下でも一応作動はするのですが、いちいちForNextでまわさずにできないものかと質問させていただきました。 よろしくお願いします。(o。_。)oペコッ Sub クリアテスト() Dim c As Range For Each c In ActiveSheet.UsedRange If c.Locked = False Then c.ClearContents End If Next End Sub
- ベストアンサー
- オフィス系ソフト
- 可視セルを対象としたcountifができるでしょうか?
オートフィルターで表示してある所だけを対象としてcountifで対象 値の数を出したいのでのですが できますでしょうか? Sub countif() Range("C1") = Application.WorksheetFunction.countif(Range("A:A").SpecialCells(xlCellTypeVisible), Range("B1")) End Sub イメージはこんな感じなのですがよろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBA実行エラーの対処方法
以前教えていただいた構文ですが、NOWより過ぎてない日付がFirstRow 31より有り、過ぎた日付がない場合に実行するとエラーが出ます。これを回避するのを教えてください。 宜しくお願いします。 Const DateColumn = "B" '日付が入力されている列 Const FirstRow = 31 '削除の対象となる可能性がある最初の行 Dim LastRow With ActiveSheet LastRow = .Range(DateColumn & Rows.Count).End(xlUp).row If LastRow <= FirstRow Then MsgBox "処理すべきデータがありません。" _ & vbCrLf & "マクロを終了します。" _ , vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With .Range(DateColumn & FirstRow - 1 & ":" & DateColumn & LastRow) _ .AutoFilter Field:=1, Criteria1:="<=" & Now, _ Field:=1, Criteria2:="", Operator:=xlOr .Range(DateColumn & FirstRow & ":" & DateColumn & LastRow) _ .SpecialCells(xlCellTypeVisible).EntireRow.Delete .Cells.AutoFilter End With With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With
- ベストアンサー
- Visual Basic
- 図形のクリアで実行時の1004エラーになる
指定範囲(I9:CW40)から図形(円・四角形)のクリアをするとエラーになってしまいます。終了をすればクリアはできるのですが。御教授願えませんでしようか?(尚四角形はセルの枠線上に貼り付けるようにしてあります。) Sub 図形のクリア() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim myRng As Range Dim sp As Variant Set myRng = Range("I9:CW40") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then sp.Delete (ここで実行時1004のエラーになる。) End If Next Set myRng = Nothing Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
- ベストアンサー
- Visual Basic
- エクセルVBAでユーザーフォームのテキストボックス
ユーザーフォーム上にテキストボックスを8個設置しました。 そこに数値が入力された場合は自動的にカンマ区切りが表示されるように以下のコードを書きました。 これで希望の動きはしてくれるのですが、このやりかたは正しいでしょうか? また、テキストボックスは8個あるので、それぞれに下記のように8通りコードをかかなければいけないのでしょうか?ご教示ください。 Private Sub TextBox1_Change() If IsNumeric(TextBox1.Value) Then Application.EnableEvents=False TextBox1.Text = Format(TextBox1.Value, "#,##0") Application.EnableEvents=True End If End Sub 途中(2~7)略 Private Sub TextBox8_Change() If IsNumeric(TextBox8.Value) Then Application.EnableEvents=False TextBox8.Text = Format(TextBox8.Value, "#,##0") Application.EnableEvents=True End If End Sub
- ベストアンサー
- Excel(エクセル)
- FAX-2840を使った通信方法とトラブルの解決方法についてご説明します。感熱紙タイプのFAXからFAX-2840に切り替える際に必要な注意点や接続方法、送受信の手順などを詳しく解説します。
- FAX-2840はPCを使用せずに電話回線だけで通信することができます。古い感熱紙タイプのFAXから切り替える際にも簡単に使い始めることができます。ただし、トナーやドラムの交換には注意が必要です。
- 電話回線の種類に関しては、IP電話に対応しています。アナログ回線やISDN回線など他の種類の電話回線でも使用することができますが、接続方法には注意が必要です。適切な接続方法を選び、正しく設定を行うことでスムーズに使用することができます。
お礼
有難うございました。 例にあげた質問には入れていませんでしたが、さらに「定数」も条件に加え、以下のようにしてうまく行きました。 Sub シートクリア() With Application .Calculation = xlCalculationManual .EnableEvents = False With ActiveSheet ' For Each c In .UsedRange.SpecialCells(xlCellTypeVisible) For Each c In Intersect( _ .Cells.SpecialCells(xlCellTypeConstants, 23), _ .Cells.SpecialCells(xlCellTypeVisible), .UsedRange) If c.Locked = False Then c.MergeArea.ClearContents End If Next End With .Calculation = xlCalculationAutomatic .EnableEvents = True End With End Sub
補足
出来た! と喜んだのもつかの間。 シートに保護をかけていざ本番!となったら実行時エラーです。 エクセル2000では保護したシートにSpecialCellsは使えないようです。 まあ、これは何とか対応できましたが。 一応、ご報告いたします。