エクセルVBAの文字列操作について2
以前、こちらでご教授いただいた以下のような文字列操作方法があります。
この方法ですと例えば[1-3]から3をひいた際に"1-2"と表示されますが
今回は連続する数字が2つの場合は1,2と表示させ3つ以上の場合は-でつないで表示させたいと思います。
一週間ほど考えたのですが解決できませんでした。
どなたかご協力お願いいたします。
質問内容
例えば、[1-10,15-20,22-38]と入っているセルがあるとします。
このセルに数を足したり引いたりしたいのです。
例えば、このセルから”5”を引いて[1-4,6-10,15-20,22-38]と表示したり、
"21"を足して[1-10,15-38]と表示したい。
いただいたご回答
A1 セル に「1-10,12,15-20,22-38」と入力されているとして、別のセルに
=NUMORDER(A1,-5)
と入力すると「1-4,6-10,12,15-20,22-38」と表示し
=NUMORDER(A1,21)
と入力すると「1-10,12,15-38」と表示します。
1つ目の引数には「セル番地」または「文字列」を、2つ目の引数には「1 ~ 99 までの整数」をお入れください。
Function NUMORDER(myStr As Variant, num As Integer) As String
Dim i As Long
Dim j As Double
Dim myNum As Variant
'文字列中の スペース を削除
myStr = Replace(myStr, " ", "")
'文字列の前後に「0」・「100」を挿入
Select Case Left(myStr, 2)
Case "1,", "1-"
myStr = myStr & ",100"
Case Else
myStr = "0," & myStr & ",100"
End Select
'文字列を カンマ で分割し、ハイフン の区間の数字を補完する
myStr = Split(myStr, ",")
For i = 0 To UBound(myStr)
If InStr(myStr(i), "-") > 0 Then
myNum = Split(myStr(i), "-")
myStr(i) = ""
For j = myNum(0) To myNum(1)
myStr(i) = myStr(i) & " " & j
Next
myStr(i) = Trim(myStr(i))
End If
Next
'欠番に「●」を入れ、「数を足したり引いたり」する
myStr = Split(Join(myStr))
For i = 0 To UBound(myStr) - 1
myStr(i) = myStr(i) & Application.WorksheetFunction.Rept(" ●", myStr(i + 1) - myStr(i) - 1)
Next
myStr = Split(Join(myStr))
If num > 0 Then
myStr(num - myStr(0)) = num
Else
myStr(-num - myStr(0)) = "●"
End If
'前後に挿入した「0」・「100」を削除
myStr = Replace(Join(myStr), " 100", "")
If Left(myStr, 2) = "0 " Then myStr = Right(myStr, Len(myStr) - 2)
'連続数字を ハイフン で繋ぐ
myStr = Split(myStr, "●")
For i = 0 To UBound(myStr)
If myStr(i) <> " " Then
myNum = Split(Trim(myStr(i)))
If UBound(myNum) > 0 Then
myStr(i) = myNum(0) & "-" & myNum(UBound(myNum))
End If
End If
Next
'カンマ で文字列に分割する
myStr = Application.Trim(Join(myStr))
NUMORDER = Replace(myStr, " ", ",")
End Function
等しく「長いコーディング箇所」が何度も繰り返される場合のテクニック?!
例えば、
If var = 1 Then
Range(color_position).Interior.ColorIndex = const_color_1
Elseif var = 2 Then
Range(color_position).Interior.ColorIndex = const_color_2
Elseif var = 3 Then
Range(color_position).Interior.ColorIndex = const_color_3
:
:
Elseif var = 20 Then
Range(color_position).Interior.ColorIndex = const_color_20
End IF
なんて場合、
「Range(color_position).Interior.ColorIndex」の箇所が、何度も繰り返されるわけです。
そういう箇所が、至るところにある場合、ファイルサイズが大きくなり、
色々とデメリットがあるような気がしています。
(単純にファイルサイズが無駄に大きい、ファイルの保存に時間がかかる、などのデメリット。場合によっては、処理速度にも悪影響を及ぼす?!)
そこで、
Dim set_color As Object
Set set_color = Range(color_position).Interior.ColorIndex
のようにすれば(Withを使っても良いですが)、前述のコード例は、
If var = 1 Then
set_color = const_color_1
Elseif var = 2 Then
set_color = const_color_2
Elseif var = 3 Then
set_color = const_color_3
:
:
Elseif var = 20 Then
set_color = const_color_20
End IF
こんなにスッキリ♪
となりますが、こういう考え方で作業をするのは、
実際、価値があると言えますでしょうか?
むしろ、デメリットであったりするのでしょうか?
アドバイスを宜しくお願い致します。
【VBA】ユーザ定義関数が動かない
下記のようなプログラムをVBEの標準モジュールに記述して、
ワークシートの適当なセルに「=tc("aa","bb")」と入力してEnterを押した所
セルの表示が「=tc("aa","bb")」となってしまい狙った効果が得られません。
本当は、「aabb」と表示させたいのですが、なぜうまくいかないのでしょうか。
ご教授願います。
◆関数の仕様
引数1と引数2に入力された文字列を連結して返り値として返す。
◆コード
Function tc(str1 As Range, str2 As Range) As String
Dim Str As String
Str = str1.Value & str2.Valuett
tt = Str
End Function
エクセル 複数シートを一つのシートにまとめるマクロについて
こんにちは いつもお世話になっています
あるサイトから上記の目的のマクロを参考にして試したんですが、所有してるデスクトップPCでは成功するのに、ノートPCでは次のエラーが出ます。
「コンパイルエラー 変数が定義されていません」そして、以下に載せたコードの「k = 1」の部分が青い背景色になります。とりあえず、デスクトップでできるので間に合うのですが、ノートPCでのトラブル理由を今後のために勉強したいのです。理由を教えてください。
エクセル2003 SP3
ノートPCは工人舎のモバイルSA1F0
参考にさせていただいたサイトは「エクセル 複数シートを一つに集約」
http://okwave.jp/qa/q1608016.html?order=DESC&by=datetime
コード引用
集約用にSheet3を確保します・
Sheet3以外の全シートを集約します。
Sub test07()
Dim sh3 As Worksheet
Dim sh As Worksheet
Set sh3 = Worksheets("Sheet3")
k = 1
For Each sh In ActiveWorkbook.Worksheets
If sh.Name <> "Sheet3" Then
MsgBox sh.Name
sh.UsedRange.Copy
sh3.Cells(k, "A").Select
sh3.Paste
k = k + sh.UsedRange.Rows.Count
End If
Next
End Sub
引用終わり
よろしくお願いします