人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excel(エクセル)2007のVBAです。
1列において、&結合(数式)されているセルのデータを「値」として扱い、
文字数(バイト数)の条件に従って範囲指定(薄いブルー囲われた状態に)するVBAコード(ソース)を教えていただきたいです。


(※長いので「この質問・回答へのコメント」欄に続きを書いています。よろしくおねがいします。)

●質問者: ヘンリ
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Excel VBA エクセル コメント コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど
●180ポイント

一例

Sub Macro1()
  '準備
 Dim i As Long
 Dim strLength As Long
 Dim startCell As Range, targetColumn As Long, startRow As Long, lastRow As Long
 Range("E2").Select:  'スタートするセルを書いておく
 strLength = 25: '判定文字数を書いておく
 
  '初期設定
 targetColumn = Selection.Column: '対象列を求める
 startRow = Selection.Row + 1: '作業開始行を求める
 lastRow = Cells(Rows.Count, targetColumn).End(xlUp).Row: '最終行を求める
 
  '実行
 For i = startRow To lastRow
 If Len(Cells(i, targetColumn).Value) > strLength Then
  '判定文字数以上のセルはセレクトに加える
 Range(Selection, Cells(i, targetColumn)).Select
 Else
  '「詰めて扱うという想定」なので25文字以下の行になったらループを抜ける
  '詰めずに最終行までセレクトする場合には下記Exit Forは削る
 Exit For
 End If
 Next i
End Sub
◎質問者からの返答

windofjulyさん

ご回答ありがとうございます。

コードの方、試させていただきました。

エラーもなく、私の望んだ仕様通りに動いてくれました。

条件を変えるにしても、コードの変更箇所も少ないので

かなり使いやすいVBAだと思います。


2 ● Mook
●210ポイント ベストアンサー

前回の質問のコメントで変数の話題が、そこで書かれていたように日本語も変数に使えます。


ただ、古くからプログラミングをしている人の場合、日本語は問題を引き起こしたりするケースがあり、これが習慣になっている場合もあります。

また、外国語環境を想定する場合などは運用上使わないことが一般的です。

(私はこれらの理由からプログラム中では日本語を使用していません。)


ただ、個人で使用する範囲ではほとんど問題ないので、そこは好みでよいと思います。

試しに書いてみるとこんな感じでしょうか。

'// コマンドボタン処理
'// -----------------------------------------------
Private Sub CommandButton1_Click()
 Const 選択文字数 = 50
 
'-- 選択セルを含んだ列対象の場合
 指定文字数以上の選択 ActiveCell.Column, 選択文字数

'-- E 列固定の場合
' 指定文字数以上の選択 4, 選択文字数
End Sub

'// 対象1: 対象列 A=1 ... E=4 ...
'// 引数2: 選択条件文字数
'// 引数3: 処理開始行(省略可:デフォルト 2)
'// -----------------------------------------------

Sub 指定文字数以上の選択(対象列 As Long, 選択文字数 As Long, Optional 開始行 As Long = 2)
 Dim 最終行 As Long
 最終行 = Cells(Rows.Count, 対象列).End(xlUp).Row
 
 Dim 選択対象 As Range
 Set 選択対象 = Nothing

 DimAs Long
 For= 開始行 To 最終行
 If LenB(StrConv(Cells(, 対象列).Value, vbFromUnicode)) >= 選択文字数 Then
 If 選択対象 Is Nothing Then
 Set 選択対象 = Cells(, 対象列)
 Else
 Set 選択対象 = Union(選択対象, Cells(, 対象列))
 End If
 End If
 Next

 If 選択対象 Is Nothing Then
 MsgBox "選択対象がありません"
 Else
 選択対象.Select
 End If
End Sub

上記のコードを(私にとって)普通に書いたら、下記のようになるでしょうか。

やはり慣れた書き方の方が落ち着きますw。

Option Explicit

'// コマンドボタン処理
'// -----------------------------------------------
Private Sub CommandButton1_Click()
 Const SelectLength = 50
 
'-- 選択セルを含んだ列対象の場合
 SelectData ActiveCell.Column, SelectLength

'-- E 列固定の場合
' SelectData 4, 選択文字数
End Sub

'// 対象 dstCol : 処理対象行 A=1 ... E=4 ...
'// 引数 SelectLength: 選択条件文字数
'// 引数 startRow : 処理開始行(省略可:デフォルト 2)
'// -----------------------------------------------
Sub SelectData(dstCol As Long, SelectLength As Long, Optional startRow As Long = 2)
 Dim lastRow As Long
 lastRow = Cells(Rows.Count, dstCol).End(xlUp).Row
 
 Dim SelectRange As Range
 Set SelectRange = Nothing

 DimAs Long
 For= startRow To lastRow
 If LenB(StrConv(Cells(, dstCol).Value, vbFromUnicode)) >= SelectLength Then
 If SelectRange Is Nothing Then
 Set SelectRange = Cells(, dstCol)
 Else
 Set SelectRange = Union(SelectRange, Cells(, dstCol))
 End If
 End If
 Next

 If SelectRange Is Nothing Then
 MsgBox "選択対象がありません"
 Else
 SelectRange.Select
 End If
End Sub
◎質問者からの返答

Mookさん

毎回細かいところまでお答えいただき、ほんとうにありがとうございます。

この質問でも、前回の質問の流れを汲んで回答なさってくれるので大変助かります。

日本語を極力使わない理由、かなり納得しました。

それはあまり見かけない訳ですね!


今回の質問のコードについても、さすがでした。

一度コードを書いておけば、あとは「選択文字数」の条件を変更するとき以外コードをいじる必要がない仕様というのは

かなり嬉しいですね!

私の要望を上回るコード、参りました。

すぐ使わせていただきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ