Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6595 / 13646 ツリー ←次へ | 前へ→

【44302】特定列の文字数確認 ほほえみ 06/11/12(日) 19:19 質問[未読]
【44306】Re:特定列の文字数確認 Mk 06/11/12(日) 19:35 発言[未読]
【44307】Re:特定列の文字数確認 Mk 06/11/12(日) 19:51 発言[未読]
【44325】Re:特定列の文字数確認 ほほえみ 06/11/13(月) 12:41 お礼[未読]
【44308】Re:特定列の文字数確認 ichinose 06/11/12(日) 20:01 発言[未読]
【44324】Re:特定列の文字数確認 ほほえみ 06/11/13(月) 12:39 質問[未読]
【44326】Re:特定列の文字数確認 ichinose 06/11/13(月) 13:02 発言[未読]
【44336】Re:特定列の文字数確認 ほほえみ 06/11/13(月) 16:20 質問[未読]
【44342】Re:特定列の文字数確認 ichinose 06/11/13(月) 17:16 発言[未読]
【44354】Re:特定列の文字数確認 ほほえみ 06/11/13(月) 20:52 質問[未読]
【44356】Re:特定列の文字数確認 ichinose 06/11/13(月) 22:00 発言[未読]
【44359】Re:特定列の文字数確認 ほほえみ 06/11/13(月) 23:23 お礼[未読]
【44310】Re:特定列の文字数確認 Kein 06/11/12(日) 21:10 回答[未読]
【44337】Re:特定列の文字数確認 ほほえみ 06/11/13(月) 16:21 お礼[未読]

【44302】特定列の文字数確認
質問  ほほえみ  - 06/11/12(日) 19:19 -

引用なし
パスワード
   お願いします。

表の自動作成をを作っています。そこで
B列の5行目から最終行までにおいて
セルの文字数が全角10(半角20)文字を超える場合
そのデータとアドレスを抽出したく思います。
全角10(半角20)の文字数制限はどのようにすれば出来るでしょうか



【44306】Re:特定列の文字数確認
発言  Mk  - 06/11/12(日) 19:35 -

引用なし
パスワード
   ▼ほほえみ さん:
今晩は・・・
>全角10(半角20)の文字数制限はどのようにすれば出来るでしょうか
・・・の意味がいまひとつ分からないのですが・・・

とりあえず、10ポイント以上の文字があるときMsgBoxにアドレスを
表示しました。

Sub Macro1()
 Dim R As Range
 Dim MyR As Range
 Set MyR = Range("B5", Range("B65536").End(xlUp))
  For Each R In MyR
   If R.Font.Size > 10 Then
    MsgBox R.Address(0,0)
   End If
 Next 
End Sub

【44307】Re:特定列の文字数確認
発言  Mk  - 06/11/12(日) 19:51 -

引用なし
パスワード
   ▼ほほえみ さん:
こんな感じでしょうか
Sub Macro1()
 Set MyR = Range("B5", Range("B65536").End(xlUp)) 
  For Each R In MyR
   With R.Font
   If .Size >= 10 Then
    MsgBox R.Offset.Address(0, 0) & "の文字サイズは" & Chr(10) & R.Font.Size & "ポイントです"
    .Size = 10
   End If
  End With
 Next
End Sub

【44308】Re:特定列の文字数確認
発言  ichinose  - 06/11/12(日) 20:01 -

引用なし
パスワード
   こんばんは。


>
>表の自動作成をを作っています。そこで
>B列の5行目から最終行までにおいて
>セルの文字数が全角10(半角20)文字を超える場合
>そのデータとアドレスを抽出したく思います。


>全角10(半角20)の文字数制限はどのようにすれば出来るでしょうか
セルのバイト数の求め方もいくつかありますが、

Sub test()
  Dim crng As Range
  Dim rng As Range
  Set rng = Range("b5", Cells(Rows.Count, "b").End(xlUp))
  If rng.Row >= 5 Then
    For Each crng In rng
     With crng
       If Evaluate("lenb(" & .Address & ")") > 20 Then
        MsgBox .Address & " = " & crng.Value & vbCrLf & _
            "lenb(" & .Address & ")= " & Evaluate("lenb(" & .Address & ")")
        End If
       End With
     Next
    End If
End Sub


私は、ワークシート関数のLenbを使うことが多いです。

【44310】Re:特定列の文字数確認
回答  Kein  - 06/11/12(日) 21:10 -

引用なし
パスワード
   >データとアドレスを抽出
の量が多いと、MsgBoxで一つずつ表示するのは煩わしいと思いますので、
イミディエイトウィンドウに出力することとして・・

Sub Data_Check()
  Dim C As Range

  On Error GoTo ELine
  With Range("B5", Range("B65536").End(xlUp)).Offset(, 254)
   .Formula = "=IF(LENB($B5)>20,1,"""")"
   For Each C In .SpecialCells(3, 1)
     With C.Offset(, -254)
      Debug.Print .Address(0, 0) & " : " & vbLf & .Value
     End With
   Next
ELine:
   .ClearContents
  End With
  If Err.Number <> 0 Then
   MsgBox "20バイトを超える値は入力されていません", 64
  End If
End Sub  

【44324】Re:特定列の文字数確認
質問  ほほえみ  - 06/11/13(月) 12:39 -

引用なし
パスワード
   ichinoseさん

ありがとうございます。
動作しました。

そこで質門なのですが

下記を表示させるとき適合したセルが複数ある場合
その回数だけmsgboxが表示されます。
これを一度のmsgboxで適合セル全てを表示させたいのですが
良い方法は無いでしょうか

If Evaluate("lenb(" & .Address & ")") > 20 Then
MsgBox .Address & vbCrLf
End If

【44325】Re:特定列の文字数確認
お礼  ほほえみ  - 06/11/13(月) 12:41 -

引用なし
パスワード
   Mkさん

アドバイスありがとうございました。
何とかできました

【44326】Re:特定列の文字数確認
発言  ichinose  - 06/11/13(月) 13:02 -

引用なし
パスワード
   ▼ほほえみ さん:
こんにちは。
出掛けてしまうので後の投稿は、夕方になります(問題があった場合)。

'=====================
Sub test()
  Dim mes_mem() As String
  Dim crng As Range
  Dim cnt As Long
  Dim rng As Range
  Set rng = Range("b5", Cells(Rows.Count, "b").End(xlUp))
  If rng.Row >= 5 Then
    cnt = 0
    For Each crng In rng
     With crng
       If Evaluate("lenb(" & .Address & ")") > 20 Then
        ReDim Preserve mes_mem(1 To cnt + 1)
        mes_mem(cnt + 1) = cnt + 1 & " : " & .Address & " = " & .Value
        cnt = cnt + 1
        End If
       End With
     Next
    If cnt > 0 Then
     MsgBox Join(mes_mem(), vbCrLf)
    Else
     MsgBox "no data"
     End If
    Erase mes_mem()
   
   
    End If
End Sub


ただし、Msgboxは表示文字数に制限がありますから、
注意して下さい。

【44336】Re:特定列の文字数確認
質問  ほほえみ  - 06/11/13(月) 16:20 -

引用なし
パスワード
   ichinose さん ありがとうございます。

一つ教えて頂きたいのですが
下記の様に手を加えてみました。
1、rows.countをA列のデータ数を基準にする
2、別シートからsheet1にあるデータを動作させる

しかし、別シートから実行すると反応がありません。
何がいけないでしょうか

with worksheets("sheet1")
  lastrow = .Range("A65536").End(xlUp).Row
  Set rng = .Range(.Range("E11"), .Cells(Lastrow, "E"))

【44337】Re:特定列の文字数確認
お礼  ほほえみ  - 06/11/13(月) 16:21 -

引用なし
パスワード
   Kein さん ありがとうございます。

アドバイス頂いたイミディエイトウィンドウ
もう少し学んでみようと思います。

【44342】Re:特定列の文字数確認
発言  ichinose  - 06/11/13(月) 17:16 -

引用なし
パスワード
   ▼ほほえみ さん:
こんばんは。

>一つ教えて頂きたいのですが
>下記の様に手を加えてみました。
>1、rows.countをA列のデータ数を基準にする
>2、別シートからsheet1にあるデータを動作させる
>
>しかし、別シートから実行すると反応がありません。
>何がいけないでしょうか
Sub test()
  Dim lastrow As Long
  Dim mes_mem() As String
  Dim crng As Range
  Dim cnt As Long
  Dim rng As Range
  With Worksheets("sheet1")
    lastrow = .Range("A65536").End(xlUp).Row
    Set rng = .Range(.Range("E11"), .Cells(lastrow, "E"))
    End With
  If rng.Row >= 5 Then
    cnt = 0
    For Each crng In rng
     With crng
       If Evaluate("lenb(" & .Address(, , , True) & ")") > 20 Then
'                   ポイントは↑ここ
'別シートのセルを参照するときは、セルに入力する数式でも aaa!a1 というように
'シート名を含んだ参照が必要ですよね!! それと同じです。 
        ReDim Preserve mes_mem(1 To cnt + 1)
        mes_mem(cnt + 1) = cnt + 1 & " : " & .Address & " = " & .Value
        cnt = cnt + 1
        End If
       End With
     Next
    If cnt > 0 Then
     MsgBox Join(mes_mem(), vbCrLf)
    Else
     MsgBox "no data"
     End If
    Erase mes_mem()
    End If
End Sub


確認してみてください。

【44354】Re:特定列の文字数確認
質問  ほほえみ  - 06/11/13(月) 20:52 -

引用なし
パスワード
   ichinose さん 有難うございました。

無事に出来ました。感謝します。

2点ほど教えて頂きたいのですが
(" & .Address(, , , True) & ") について

1、(" & & ") は何故必要なのでしょうか?
2、(, , , True) はどのような意味でしょうか

申し訳ありません。

【44356】Re:特定列の文字数確認
発言  ichinose  - 06/11/13(月) 22:00 -

引用なし
パスワード
   >2点ほど教えて頂きたいのですが
>(" & .Address(, , , True) & ") について
>
>1、(" & & ") は何故必要なのでしょうか?
何故がどこに掛かっているのかはっきりわかりませんが・・・。

まず、Evaluateについて、Helpを調べてみてください。
私なりの解釈は、過去ログ

hxxp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=8117;id=excel

に記述してあります。

↑でも記述しましたが、

Evaluate −−−−> 指定された文字列式を評価した結果を返します

と解釈すると、

Evaluate(・・・・)の()内は、文字列式を指定する事になります。

Evaluateを使うと セルに入力する関数や数式も評価してくれます。

その文字列式を組み立てるために

文字列の連結には、「&」を使います(疑問はこれですか?)。


新規ブックの標準モジュールに

Sub main()
  With Range("a1")
    .Value = String(10, "あ")
    MsgBox "lenb(" & .Address(, , , True) & ")" & vbCrLf & "↑この数式をEvaluateで評価します"
    MsgBox "Evaluate(""lenb(" & .Address(, , , True) & ")"") = " & Evaluate("lenb(" & .Address(, , , True) & ")")
    End With
End Sub

これを実行して再度、検討してみてください。


>2、(, , , True) はどのような意味でしょうか

Helpには、Trueを指定すると外部参照、False(省略)でローカル参照を返す

と書いてあります。


まっ、実際にTrueがあるときとないときのAddressプロパティを比較してみれば
一目瞭然かと思います。

新規ブックの標準モジュールに

'====================================
Sub test()
  With Range("a1")
    MsgBox "Address = " & .Address & vbCrLf & _
       "Address(,,,true) = " & .Address(, , , True)
    End With
End Sub

これを実行して結果を比べてください。


それから、Helpを見て調べられるようにしましょう!!

これができないとVBAの習得はかなり大変ですよ!!

【44359】Re:特定列の文字数確認
お礼  ほほえみ  - 06/11/13(月) 23:23 -

引用なし
パスワード
   ichinose さん ありがとうございました。

勉強になりました。

6595 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free