Excel2013 既存コードの修正方法とClean関数の利用について

このQ&Aのポイント
  • エクセル2013の既存コードを修正する方法を教えてください。
  • Clean関数をマクロに取り込み、Trim部分をCleanに変えたのですがうまく動作しません。
  • 具体的なコードの組み方、パスワードで保護されたブックでの利用方法も教えてください。
回答を見る
  • ベストアンサー

エクセル2013 既存コードを用いて修正

Clean関数をマクロに取り込みたいのですが 下記コードの Trim部分をCleanにしただけではダメでした。 どのようなコードを組んだら宜しいでしょうか? ご教示ください。 Sub Clean() Dim rng As Range For Each rng In Selection rng.Value = Trim(rng.Value) '←TrimをCleanにしただけではダメでした Next rng End Sub 実際は AからL列まで入力されています。 D列の最終入力セルを取得してB,E,F列をCleanにしたいです。 (AからLでも構いません) ブックはパスワードで保護されています。 データは8行目から入力されています。 (7行目は見出し)

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

質問には「Clean関数」に関することと、 >D列の最終入力セルを取得してB,E,F列をCleanにしたいです。 >(AからLでも構いません) >データは8行目から入力されています。 とあるので、参考にモジュールを書いてみました。シートのコードウィンドウを使っています。(当方、Excel2010です) Sub 制御文字の削除()   Dim rg As Range     'セル   Dim lastRow As Long   '最終行   Dim strRange As String '処理セル範囲      lastRow = Range("D" & Rows.Count).End(xlUp).Row     'B、E、F列指定     strRange = "B8:B@, E8:E@, F8:F@" 'とりあえず最終行は@     strRange = Replace(strRange, "@", lastRow) '置き換え      For Each rg In Range(strRange)     rg.Value = Application.Clean(rg.Value)   Next End Sub 質問にある「Trim関数」についてですが、この質問を参考にすると、提示の   「rng.Value = Trim(rng.Value) 」 はワークシート関数をマクロに取り込もうとしているように思えますが、このままでは、VBAのTrim関数を使っています。意図的にそうしてあれば、以下は読み飛ばしてください。 ●Trim関数について ■VBA構文  LTrim(String)  先頭のスペース削除  RTrim(String)  末尾のスペース削除  Trim(String)   先頭と末尾のスペース削除   ■ワークシート関数のTrim関数  先頭と末尾の空白を削除し、さらに文字列中に連続する空白があった場合、空白を1つにして残りを削除します。    従って、VBAで直接 rg.Value = Trim(rg.Value) としてもワークシート関数のTrim関数と同じ結果にはなりません。VBAのTrim関数では、文字列中の空白を削除することはできないため、文字列中の空白を削除する場合は、Replace関数を使うことになります。  どちらを使うかで Application を付けたり付けなかったりします。ワークシート関数がVBAで使えても、同じ結果になるとは保障されません。十分確認することが必要です。Trim関数よりも有名な違いのある関数にRound関数があります。(「excel round関数 違い vba」くらいでググってみてください)  ExcelとAccessでDateDifとDateDiffとか面白い?例が結構あります。ご参考に。

maron1010
質問者

お礼

丁寧な説明と指示をありがとうございます。 提示されたコードを利用させていただきたいと思います。

その他の回答 (2)

回答No.3

Clean関数というのは、本来、印刷に影響あるバイナリコードを除去する目的で作られたというのが、建前です。実際は、現代では意味がありませんが、昔、ワークシートをエラー起こすバイナリコードが入り込むのを除去する目的だったようです。 >TrimをCleanにしただけではダメでした 一体、何をターゲットとして、除去するのでしょうか? Trim と Clean関数の性格はかなり違うものですが……。 以下のコードは、今とは違う書き方をしていますが、ネットで見つけた文書などから、空白を除去する目的で、10年ぐらい前に作ったコードです。半角のスペースは残してあります。もし、全部のスペースを取る場合は、VBA関数のReplaceで、Space(1)で、TextCompare にすればよいです。 当時は、このぐらいしか書けませんでしたが、今でも、使えます。 '-------------------   Dim strVal As String   Dim c As Range   Dim Rng As Range   If Not Selection Is Nothing Then    Set Rng = Selection   End If   For Each c In Rng    strVal = Application.Clean(c.Value)    strVal = Application.Substitute(strVal, ChrW(160), "")    strVal = Application.Substitute(strVal, " ", "") '全角空白    c.Value = Trim(strVal)   Next '------------------- とりあえず、ご参考まで。

maron1010
質問者

お礼

いつもお世話になっております。 私にはまだまだ難しすぎて、理解できません。(すみません) しかし今後のためにも、参考にさせて頂きます。 ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

rng.value = application.clean(trim(rng.value)) みたいな。 ワークシート関数のCLEANを使うなら、application.worksheetfunctionの下に書かなきゃなりません。 TrimのようにVBA側で用意されている関数があるのか無いのか、参考書やオブジェクトブラウザなどで勉強しながら使います。

maron1010
質問者

お礼

今回は色々とありがとうございました。

関連するQ&A

  • VBAの記録を追加したい

    エクセル2002使用です。 VBAで次のコードを使っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Target = Intersect(Range("C:C"), Target) If Target Is Nothing Then Exit Sub For Each Rng In Target If Rng.Value <> "" Then Rng.Offset(, -2).Value = Now Else ' (*) Rng.Offset(, -2).Value = "" ' (*) End If Next Rng End Sub (C列のセルに何か入力されると、A列の同じ行にその時刻が入る。) 同じシートで、F列に何か入力されるとE列の同じ行にその時刻が入るように書き直したいのですが、どうすればいいのでしょうか? すいませんが、よろしくお願いします。

  • Excelマクロについて

    先日、OKWEBで教えてもらったマクロに手を加えて作ろうとしたのですが、エラーがでて動かなくなりました。 わかる方がいましたら教えてください。 よろしくおねがいします。 Sub 見積書() Application.ScreenUpdating = False '見積書(完成)シートを選択 Sheets("見積書(完成)").Select '行の高さを「15」にする。 Rows("6:67").Select Range("F6").Activate Selection.RowHeight = 15 'S列のS6:S56をコピーしてE6:E7に貼り付ける。 Range("S6:S56").Select Selection.Copy Range("E6:E7").Select ActiveSheet.Paste '5列目(工数)が「0」のとき該当する行の高さを「0」にする。 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 If Cells(i, 5).Value = "0" And Cells(i, 7).Value = "0" Then Rows(i).RowHeight = 0 End If Next '「E8:E55」の範囲を四捨五入する。 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 Range("E8:E55") = Application.Round(Range("E8:E55"), 0) '工数を四捨五入 Next 'C列の中に含まれる「小計」を検索しそこから6列目が「0」だったら行の高さを「0」にする。 Dim Rng As Range Const Retu = "C" For Each Rng In Range(Retu & "1", Range(Retu & "100").End(xlUp)) If Trim(Rng.Value) = "小   計" And _ Rng.Offset(, 6) = 0 Then Rng.EntireRow.Hidden = True End If Next Rng End Sub

  • Excel のVBAに付いて教えて下さい。

    前回、質問しました内容が関連してくるんですが 参考に下記のURLを ご覧になって下さい。 http://okwave.jp/qa/q7472816.html 前回の内容ですと、指定した列を月で指定してComboboxで選択していました。 その指定した列に特定の文字数を入力すると言う動作を作成しました。 特定の文字数を入力すると言う内容ですが、現時点では指定した列に上から下に 順序に入力して行くように作成してます。 そのコードが”Set myRng = Range(rng).End(xlUp).Offset(1)”です。 今回は、Comboboxで指定した列の2つ隣の列に日付が入力されています。 2つ隣と言うのは、左に向かって2つ隣です。 例えばC列を指定したとすればA列を表します。 実際に行いたいことは、指定した列の日付の入った行を検索し、指定した日付の所に 文字数を入力したいと考えています。 Userformを使って入力しているんですが、Combobox1が月の列を選択していますので、 新たにCombobox2を作りCombobox2で指定した日付(行)を選択し入力できる様に作成 したいのですが・・・今、使っているコードを基にCommandbox2を追加して作成できますでしょうか? 現在のコードは下記です。 Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 12 Me.ComboBox1.AddItem i & "月" Next End Sub Private Sub CommandButton1_Click() Dim myRng As Range Dim rng As String Select Case ComboBox1.Value Case "1月": rng = "az76" Case "2月": rng = "be76" Case "3月": rng = "bj76" Case "4月": rng = "ak41" Case "5月": rng = "ap41" Case "6月": rng = "au41" Case "7月": rng = "az41" Case "8月": rng = "be41" Case "9月": rng = "bj41" Case "10月": rng = "ak76" Case "11月": rng = "ap76" Case "12月": rng = "au76" Case Else: Exit Sub End Select Set myRng = Range(rng).End(xlUp).Offset(1) myRng.Value = TextBox1.Value End Sub

  • 3営業日後を取得と行データの消去

    エクセル2013 D列に入力があると同行のA列に日付(時間)が入力されるように設定してあります。 (B列にはユーザー名) その時、A列の日付を基準に、E列に 3営業日後の日付を入力させるには どのようなマクロを組んだら宜しいでしょうか? また、入力済行のD列を消去(空白)した場合、該当行に入力されている全データを消去するには どうしたら宜しいでしょうか?(行削除ではありません) 下記、既マクロが現在、組まれているものです。 宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim TgRng As Range Set TgRng = Intersect(Range("D:D"), Target) If Not TgRng Is Nothing Then Application.EnableEvents = False For Each Rng In TgRng Rng.Offset(, -3).Value = Now Rng.Offset(, -2).Value = LoginName Next Application.EnableEvents = True End If Set TgRng = Nothing End Sub

  • Excelで条件つき行削除について教えてください

    前回に下記のような質問をしました。 「下記のようなExcelの表があるとします。    A    B     C     D     E 1      会社A   会社B   会社C    会社D 2 仕事A 23 45 67 27 3 仕事B 45 24 65 33 4 小計 68 69 132 60 この状態のときはいいのですが、    A    B     C     D     E 1      会社A   会社B   会社C    会社D 2 仕事A 0 0 0 0 3 仕事B 0 0 0 0 4 小計 0 0 0 0 このときに小計という文字を認識し、その横にある数字を認識し、その条件がすべて「0」だった場合に処理を行いたいです。」 この回答で、 「Sub 小計全部ゼロ_行非表示() Dim Rng As Range For Each Rng In Range("A1", Range("A65536").End(xlUp))   If Trim(Rng.Value) = "小計" And _     Rng.Offset(, 1) = 0 And Rng.Offset(, 2) = 0 And _     Rng.Offset(, 3) = 0 And Rng.Offset(, 4) = 0 Then     Rng.EntireRow.Hidden = True   End If Next Rng End Sub」 このような回答がありました。 私は「小計」がC列にあり、「0」を検索したいのがF、G、H、Iにあります。 条件に合うように変更したのですがエラーが出てしまいます。 分かる方いましたら教えてください。」よろしくお願いします。

  • エクセルのマクロについて教えてください

    お世話になっております。 エクセルのマクロについて教えていただきたいのですが、 サンプルのファイルをこちらにアップしたのでよろしければご覧になってください。 http://kie.nu/yPV 質問したいことは、列Iに、各行の黄色いセルの数を表示させるマクロを作りたいのですが 途中まで何とかわかったのですがどうもうまくいきません。。 行11から各行にひとつずつ、黄色いセルが含まれていますが、その黄色いセルの中の数字を列Iに表示させたいです。行にデータがある限り、下までずっとです。 以下、途中までわかったマクロです。 Sub 黄セル値Copy() Const TgLeftUp = "A3" '<--対象範囲左上セル指定 Dim Rng As Range Dim Target As Range Set Target = Range(TgLeftUp, Cells(Rows.Count, _ Range(TgLeftUp).Column)) For Each Rng In Target.Resize(, 2) If Rng.Interior.ColorIndex = 6 Then If Rng.Column = Target.Column Then Rng.Offset(, 3).Value = Rng.Value Else Rng.Offset(, 2).Value = Rng.Value End If End If Next MsgBox "値 貼り付け完了。", vbInformation Set Target = Nothing End Sub でもこれを貼り付けてもうまくいきません。 正しいマクロを教えていただけないでしょうか?? 宜しくお願いいたします。 ※いつも、私の質問に対してまるで回答になってないような、ふざけた言葉を書き込んでは消してる方が一名だけいらっしゃいます。確か、鳥の写真をマイページに載せてる方です。 都度違反報告はしていますが、質問の趣旨に反する回答をされてる方一名、絶対にやめてください。

  • エクセル 数値結果の値によって日付を入れたい

    シート2の2列目にOKが入ると、シート1のC列にOKが入り、更新された日がB列に表示されるようにしたいです。 C列に手入力でOKと入力すればB列に日付が表示されるのですが、C列をVLOOKで呼ぶようにしたら表示されなくなってしまいました。 どのように修正していいのか分かりません。 お教えいただければと思います。よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim TgRng As Range Set TgRng = Intersect(Range("C1:C2000"), Target) If Not TgRng Is Nothing Then Application.EnableEvents = False For Each Rng In TgRng If Rng.Value = "OK" Then Rng.Offset(, -1).Value = Date End If Next Application.EnableEvents = True End If Set TgRng = Nothing End Sub

  • エクセル VBA の質問です。

    A2~A20までのセルに文字を入力した段階で、それぞれB2~B20に入力日時を入れるVBAを以下のように組んでいます。 しかし、同様の条件を同一シートのE2~E20・F2~F20にも入力・自動表示できるようにしなければならなくなり、困っています。 どのように記述を変えればよいのか、教えていただけたらと思います。 宜しく御願いいたします。 Sub Worksheet_change(ByVal Target As Range) Dim Rng As Range Dim c As Range Set Rng = Range("A2:A20") If Intersect(Target,Rng) Is Nothing Then Exit Sub For Each c In Intersect(Target,Rng) If Not IsEmpty(c) Then c.Offset(, 1).Value = Now Else c.Offset(, 1).ClearContents End If Next Rng.Offset(, 1).EntireColumn.AutoFit End Sub 申し訳ありませんが、何卒、宜しく御願いいたします。

  • このコードの修正点はありますか?

    Private Sub Clear() With Worksheets("abc") With .Range("A2", .Range("A" & Rows.Count).End(xlUp)) If .Row = 2 Then .EntireRow.Resize(, 7).ClearContents End If End With End With End Sub シートabcの、A2から最終行まで取得。 A2からA15までデータがあれば、それらの行のG列までクリア。 というコードですが、 If .Row = 2 Thenというのは、2行ならという意味ではないのですか? 1行でもデータがあればクリアにしてもらいたいのですが、 If .Row > 0 Thenみたいな感じにならないのでしょうか? 教えていただいたコードですが、この部分がわからないです。 ご教授くださいませ。

  • このコードの修正を教えてください !

    下記コードが、動作しませんので、どのように修正すればよろしいのでしょか? Sh.Range("A1").Select    がエラーになるようですが、よくわかりません。 以上 何卒、よろしくお願いいたします。 ---------------- Sub 指定したシートだけに目的データをコピー() For Each sh In Workbooks("あ.xls").Sheets '下記シート3つは、手動にて挿入したシートで、場所は前後しています If sh.Name = "Sheet1" Or sh.Name = "Sheet2" Or sh.Name = "Sheet3" Then Workbooks("い.xls").Activate Sheets("Sheet3").Select Selection.CurrentRegion.Select Selection.Copy Workbooks("あ.xls").Activate Sh.Range("A1").Select ActiveSheet.Paste End If Next End Sub

専門家に質問してみよう