[[20230217190936]] 『範囲外の列を選択してもエラーにならないようにし』(カラス) ページの最後に飛ぶ

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

 

『範囲外の列を選択してもエラーにならないようにしたいです』(カラス)

すみません。初心者ながらインターネットで調べて
VBAをくっつけて試行錯誤しているものです。

M列からAK列までの範囲内でどの行やセルを選択しても実行すれば
14行目から113行目までの数値が0.00に四捨五入され書式設定も変わる

というコードを目指して一応それを実行させる事が出来ました。

目指したい事は
M列〜AK列以外の列を選択して実行しても
・その列には何も起こらない
・もしくは「範囲外です」などのメッセージが出てくれて何も起こらない

に出来るコードを追加、ご教授頂けないでしょうか。
現状ではエラーが出てしまいます。

現状のコードは下記の様に作ってあります。
すみませんが宜しくお願い致します。

Sub 四捨五入()

    Sheets("四捨五入挑戦").Select
    Dim 列 As Range
    Dim セル As Range
    Set 列 = Selection.EntireColumn
    Set 列 = Intersect(Range("14:113"), 列)
    If WorksheetFunction.Count(gg) = 0 Then Exit Sub
    Set 列 = 列.SpecialCells(xlCellTypeConstants, xlNumbers)

    For Each セル In 列
        セル = Round(セル, 2)
        セル.NumberFormatLocal = "0.00;-0.00;0"
    Next セル
 End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


すみません、誤記がありました。
こちらが自分の中の最新になります。

Sub 四捨五入()

    Sheets("四捨五入挑戦").Select
    Dim 列 As Range
    Dim セル As Range
    Set 列 = Selection.EntireColumn
    Set 列 = Intersect(Range("14:113"), 列)
    If WorksheetFunction.Count(列) = 0 Then Exit Sub
    Set 列 = 列.SpecialCells(xlCellTypeConstants, xlNumbers)
    For Each セル In 列
        セル = Round(セル, 2)
        セル.NumberFormatLocal = "0.00;-0.00;0"
    Next セル
 End Sub
(カラス) 2023/02/17(金) 19:28:56

 >M列〜AK列以外の列を選択して実行しても
 >・その列には何も起こらない
 >・もしくは「範囲外です」などのメッセージが出てくれて何も起こらない

 参考程度ですが

 Sub test()
     Dim rng As Range, A As Range
     Set A = ActiveCell
     Set rng = Range("M:AK")
     If Intersect(A, rng) Is Nothing Then
         MsgBox "M列からAK列を選択してください。"
         Exit Sub
     End If
 End Sub
(フォーキー) 2023/02/17(金) 19:47:20

 Sub 四捨五入()
    Sheets("四捨五入挑戦").Select
    Dim 列 As Range
    Dim セル As Range
    Set 列 = Selection.EntireColumn
    Set 列 = Intersect(Range("M14:AK113"), 列) 'Range("14:113") → Range("M14:AK113")

    '以下エラートラップ追加
    If 列 Is Nothing Then
        MsgBox "Error 1"
        Exit Sub
    ElseIf WorksheetFunction.Count(列) = 0 Then
        MsgBox "Error 2"
        Exit Sub
    End If

    Set 列 = 列.SpecialCells(xlCellTypeConstants, xlNumbers)
    For Each セル In 列
        セル.Value = Round(セル.Value2, 2)
        セル.NumberFormatLocal = "0.00;-0.00;0"
    Next セル
 End Sub

最低限の変更を加えました。
(ふなば) 2023/02/17(金) 19:48:32


 こうかな?
 選択云々は意味が分からないけど、
  「実行すると、四捨五入して書式を変える」
 っていうところだけ実現するなら、配列使うといいと思う
 数字以外もまぎれてるとエラーになるけど・・・
    Sub 四捨五入()
        Dim w As Variant
        Dim 行 As Long, 列 As Long
        With Sheets("四捨五入挑戦").Range("M14:AK113")
            w = .Value
            For 行 = 1 To UBound(w, 1)
                For 列 = 1 To UBound(w, 2)
                    w(行, 列) = Round(w(行, 列), 2)
                Next
            Next
            .Value = w
            .NumberFormatLocal = "0.00;-0.00;0"
        End With
     End Sub

(稲葉) 2023/02/17(金) 19:55:05


フォーキー様
ふなば様
稲葉様

本当にありがとうございます。目から鱗です。
色んなアプローチの仕方と挙動で
どれも理想の動きをしてくれました。

本当に感謝いたします。初心者すぎてただ聞くだけではなく
頂いたコードを活用して基礎から学ぼうと思います。
改めまして本当にありがとうございます。
(カラス) 2023/02/17(金) 20:15:19


すみません、マクロ以前の問題なのかもわかりません。

ここでふなば様から教えて頂いた下記のマクロの行数だけを変更して自宅のPCで何度やっても問題なく出来る事を確認し
自宅PCで作ったxlsを会社支給のUSBメモリ経由で会社PCで実行するとアクセシビティの利用不可?になり何度やっても無限ループのようになりタスクマネージャから強制終了しています。
処理量の問題なのか会社のセキュリティ?に引っかかっているのかわかりません。

また自宅で作った他のマクロについては動くものもあって

どなたかご教授頂けないでしょうか。

フリーズするマクロ↓

  Sub 四捨五入()
    Sheets("四捨五入挑戦").Select
    Dim 列 As Range
    Dim セル As Range
    Set 列 = Selection.EntireColumn                      '改良勉強する事!
    Set 列 = Intersect(Range("M14:AK9999"), 列) 'Range("14:9999") → Range("M14:AK9999")
    '以下エラートラップ追加
    If 列 Is Nothing Then
        MsgBox "Error 1"
        Exit Sub
    ElseIf WorksheetFunction.Count(列) = 0 Then
        MsgBox "Error 2"
        Exit Sub
    End If
    Set 列 = 列.SpecialCells(xlCellTypeConstants, xlNumbers)
    For Each セル In 列
        セル.Value = Round(セル.Value2, 2)
        セル.NumberFormatLocal = "0.00;-0.00;0"
    Next セル
 End Sub

フリーズしないネットから頂いたり、自分で弄ったマクロ下↓

Sub ナンバリング()    'M列からAK列まで空白があろうが一番多い列をナンバリング

     Sheets("四捨五入挑戦").Select
    i = 15                           '15行目から開始

                                      'M列〜AK列が空白ではない場合にループ
     Do While Cells(i, "M") <> "" Or Cells(i, "N") <> "" Or Cells(i, "O") <> "" Or Cells(i, "P") <> "" Or Cells(i, "Q") <> "" Or Cells(i, "R") <> "" Or Cells(i, "S") <> "" Or Cells(i, "T") <> "" Or Cells(i, "U") <> "" Or Cells(i, "V") <> "" Or Cells(i, "W") <> "" Or Cells(i, "X") <> "" Or Cells(i, "Y") <> "" Or Cells(i, "Z") <> "" Or Cells(i, "AA") <> "" Or Cells(i, "AB") <> "" Or Cells(i, "AC") <> "" Or Cells(i, "AD") <> "" Or Cells(i, "AE") <> "" Or Cells(i, "AF") <> "" Or Cells(i, "AG") <> "" Or Cells(i, "AH") <> "" Or Cells(i, "AH") <> "" Or Cells(i, "AJ") <> "" Or Cells(i, "AK") <> ""

        Cells(i, "L") = i - 14         'L15=15-14で1が入る
        i = i + 1 'カウントアップ   'カウントアップ
    Loop

End Sub

'64bit版
Private Declare PtrSafe Sub keybd_event Lib "user32" ( _

    ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long _
        )

Public Sub スクショ全体()

    keybd_event vbKeySnapshot, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
End Sub

Sub データを開く()

    Dim fn As Variant
    Dim openfn As Variant
    ChDrive "C"
    ChDir "C:\Users\●●●\Desktop"                          'パスを指定!!!!!
    'ダイアログ表示
     fn = Application.GetOpenFilename("えくせる,*.xls*;*.csv,てきすと,*.txt*", , "お好みのファイルを選んでください♪", , True)

    'ファイルが選択された場合は開く
    If IsArray(fn) Then
        For Each openfn In fn
            Workbooks.Open openfn
        Next
    End If

End Sub

本当の理想は
M列15行目から空白になるまで0.01に四捨五入して書式も変更
それをAK列まで繰り返す
途中で空白の列があった場合は空白のまま何もしない

が理想なのですがまだ弄る知識はなく15行目から9999行目までにセットしております。

長文になりすみませんがよろしくお願いします。
知識が無く扱いが悪いのは重々承知しております。

(カラス) 2023/02/20(月) 19:16:37


すみません、長文のあまり、理想が完全に違いました。

M列からAK列までは選択した列が15行目から空白になるまで0.01に四捨五入して書式も変更
選択した列の15行目から空白の列があった場合は空白のまま何もしない

です。
ただこちらは自分の力量では無理なので。

(カラス) 2023/02/20(月) 19:21:11


もしかして:
シートで揮発関数を使っている(RAND関数等)
(ふなば) 2023/02/20(月) 20:31:45

ふなば様
コメントありがとうございます。

M列からAK列までの2行目から12行目まで
if関数
countifs関数
sum関数

などセルの数値を参照させる関数を結構使っております。
それが原因でしょうか?

自宅のPC→Ryzen5、メモリ8GB、SSD
会社のPD→Ryzen7 メモリ16GB SSD

で自宅のPCスペックで問題ないなら、、と思ったのですが、
会社はデスクトップのデータもonedriveを同期する?仕様になっております。

ここで9999行とか指定させる事がだめなのでしょうか。。。
正直普段は使っても700行とかなのですがいざというときのために9999行にしております

(カラス) 2023/02/20(月) 20:45:14


 Set 列 = 列.SpecialCells(xlCellTypeConstants, xlNumbers) '←データ入力済みセル自体が多くなければここで除かれるので大丈夫です
 列.NumberFormatLocal = "0.00;-0.00;0" 'これはループ内でやらなくても良いので外しても良いと思います。
 For Each セル In 列 '該当範囲内のセルごとに処理を行うのでここで渋滞が起きる可能性があります
   セル.Value = Round(セル.Value2, 2) 'この処理自体が重くなる原因とは考えづらいですが、このセルを参照する他のセルがある場合には要注意です
 Next セル

Application.Calculation = xlCalculationManual 'これで手動再計算化
Application.Calculation = xlCalculationAutomatic 'これで自動再計算化

確証はありませんが、これらを使うことで多少の改善がみられるかもしれません。
(ふなば) 2023/02/20(月) 21:05:40


>会社のセキュリティ?に引っかかっているのかわかりません。
私用のユーエスビーメモリ等の媒体の使用は許されいるんですか。
(MEMORY) 2023/02/20(月) 21:21:58

Sub test()
    Dim rngTarget As Range
    Dim c As Range
    Dim a As Range

    With Selection
        If .Worksheet.Name <> "四捨五入挑戦" Then Exit Sub
        Set rngTarget = .EntireColumn
    End With
    With ActiveSheet
        Set rngTarget = Intersect(rngTarget, .Range("M:AK"), .UsedRange, .UsedRange.Offset(14))
    End With
    If rngTarget Is Nothing Then Exit Sub
    If WorksheetFunction.Count(rngTarget) = 0 Then Exit Sub

    With rngTarget.SpecialCells(xlCellTypeConstants, xlNumbers)
        .NumberFormatLocal = "0.00;-0.00;0"
        For Each a In .Areas
            For Each c In a.Cells
                .Value = .Text
            Next
        Next
    End With
End Sub

固まるのはちょっとわからないですねぇ。。
(まっつわん) 2023/02/20(月) 21:32:17


ふなば様

ご指導本当にありがとうございます。
一度、手動にさせて処理させた後に自動化させるのですね、
検索したら出てきました。
本当にありがとうございます。 ループさせるマクロなどにも全部入れる癖をつけてみます。

MEMORY様
本当は良くないのでしょうが、自宅で簡単に資料とか作るのは容認されています。
いずれ会社PCも自宅に持ち帰ってよくなるそうですが。
上司にも仕事の事持ち帰らなくていいけど自分でスキルとか効率上げるためにって事なら
黙認するよと言われてます。

まっつわん様
新しいコードを助言して頂いてありがとうございます。
保存させて頂いて、モジュールに追加して試させて頂きます。
自分でコメントで一つずつ追えるようにしたいです。

皆様、本当にご迷惑をおかけします。
徹夜で今からやってみます。

(カラス) 2023/02/20(月) 21:55:01


コメント返信:

[ 一覧(最新更新順) ]


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