セル番地データをファイル名にするマクロを作成したいと思い、ユーザーフォームからセル番地データを入力できるようにテキストボックスを作りました。しかし、使用する人がセル番地「aaa」や「abvd」など番地では無いデータを入力する可能性があり、制限する方法が難しいです。
ISREF関数を使いましたが、エラー処理のコメントアウトで何時間も悩んでおります。どなたかご教示お願致します。
Private Sub Execution_Click()
Dim code, Name As String
Dim wb1, wb2 As Workbook
Dim ExtentionName As String
Dim fso As New FileSystemObject
'定数の宣言
Const folderpath As String = "C:\Users\_\Desktop\test1"
'エラー処理
If [IsRef(TextBox1.Value)] = True Or [IsRef(TextBox2.Value)] = True Then
Else
MsgBox ("適切なセル形式を入力してください")
Exit Sub
End If
filePath = Dir(folderpath & "\" & "*.xls") 'フォルダの中のファイル名を返します
'------------------------------フォルダ内部処理----------------------------------
Do While filePath <> "" '変数に空白が入るまで処理を繰り返す
If filePath <> Application.ThisWorkbook.Name Then 'マクロ実行ファイル以外を処理
Workbooks.Open Filename:=ThisWorkbook.path & "\" & filePath
Set wb1 = ThisWorkbook 'このブック
Workbooks.Open ThisWorkbook.path & "\" & filePath '別ブック
Workbooks(filePath).Activate
Set wb2 = ActiveWorkbook
'--------ファイル内部処理---------
code = wb2.Worksheets(1).Range(TextBox1.Value).Value
Name = wb2.Worksheets(1).Range(TextBox2.Value).Value
'--------ファイル内部処理---------
Workbooks(filePath).Close Savechanges:=False
ExtentionName = fso.GetExtensionName(filePath) '拡張子取得
Dim OldName
Dim NewName
OldName = ThisWorkbook.path & "\" & filePath
NewName = ThisWorkbook.path & "\" & code & "_" & Name & "." & ExtentionName
'filePath = code & "_" & Name & "." & ExtentionName
If fso.FileExists(NewName) Then 'newname があるかないか
'書き変えない
Else
Name OldName As NewName 'ファイル名変更
End If
End If
'直前に指定したファイル名が指定されたものとして、まだ返していないファイル名を順に返す
filePath = Dir()
Loop 'Do While に戻る
'------------------------------フォルダ内部処理----------------------------------
End Sub
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
>Qchan1962さんのコードが難しく感じていまして、中々解読できないでいます。
申し訳ないです。。すこし説明を加えます
メイン処理の実行時ではなくTextBox入力時にチェックする場合の例でした
ユーザーフォームを表示する時にExecution(ボタン?)を使えなくします
(いきなりボタンを押下した時の不具合を避ける為、コード内で抜けても良いけれど)
Private Sub UserForm_Initialize()
Execution.Enabled = False
TextBoxの入力が終わったらチェックします。正しくは
TextBox1またはTextBox2を入力して他のコントロールに移る時に
(Private Sub TextBox?_Exit(ByVal Cancel As MSForms.ReturnBoolean)
が実行されます
ここで IsRefCheck(TextBox1.Value)
入力チェックのPublic Function IsRefCheck(strV)が実行されチェックされます
NGの場合 Msgboxが表示されFalseが返るので
フォーカスを戻す(正しくはExitをCancel)して当該TextBoxにカーソルを戻します(クリアーも出来るのでした方が良いかも)
2回書いて分かりずらくなってしまったかも・・
使うのであればこちらの例(Elseがあるイベントプロシージャ)
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsRefCheck(TextBox1.Value) = False Then
Cancel = True
Else
If TextBox2.Value <> "" Then Execution.Enabled = True
End If
End Sub
と
Private Sub TextBox2_Exit ・・・
これも書き方変えたので判り難かったかも・・
If Not IsRefCheck(TextBox2.Value) Then
If IsRefCheck(TextBox1.Value) = False Then は同じ結果を返します
IsRefCheckがTrueでなければ(Not True)
IsRefCheckがFalseならば
このチェックが各TextBoxでTrueならば対のTextBoxは空白でないので
If TextBox1.Value <> "" Then Execution.Enabled = True
If TextBox2.Value <> "" Then Execution.Enabled = True
ボタンを押せるように設定します
あくまでこの場合の例として
Private Sub Execution_Click()には、実行できる状態である事から
既にチェック済みなのでチェック処理は必要ありません
ただ、実行完了時にTextBoxの値をクリアーしたり自身のトリガーボタンを
.Enabled = Falseにする必要があると思われます
試みたけれど上手く説明できない・・
余計に判り難くなったらごめんなさい・・
No.5
- 回答日時:
空白だった場合・・単純にIFで条件分岐を加えれば良いのでは?
思うのだけれど・・#2にも書きましたが
>番地では無いデータを入力する可能性があり、制限する
と言う事は、仮に XFD15600 とか書いた場合に対象になって良いのかな?
ついでなので 脱線した回答になりますが参考まで
ユーザーフォームを使われていると言う事なので
入力チェックは入力した時に行うのが良いと思います
理由としては、入力時の操作性、処理を分ける事で体感時間の短縮など
ではどうするか・・チェックする処理をサブやファンクションで作成します
例
Public Function IsRefCheck(strV) As Boolean
Dim rng As Range
'一応 有効範囲設定
Set rng = Range("A1:AX1000")
IsRefCheck = False
If strV = "" Then MsgBox ("空白は使用出来ません適切なセル形式を入力してください"): Exit Function
If Evaluate("ISREF(" & StrConv(strV, vbNarrow) & ")") = False Then MsgBox ("使用出来ない文字列です適切なセル形式を入力してください"): Exit Function
If Not Intersect(rng, Range(strV)) Is Nothing Then
IsRefCheck = True
Else
MsgBox ("範囲内の適切なセル形式を入力してください")
Exit Function
End If
End Function
(空白処理は要考察)
このfunctionを呼ぶイベント
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsRefCheck(TextBox1.Value) = False Then Cancel = True
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsRefCheck(TextBox2.Value) Then Cancel = True
End Sub
実際にはExecutionボタンを条件が揃うまで .Enabled = False などと設定するとか少し工夫します
例 ExecutionはCommandButtonなどのオブジェクト名
Private Sub UserForm_Initialize()
Execution.Enabled = False
・
・
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsRefCheck(TextBox1.Value) = False Then
Cancel = True
Else
If TextBox2.Value <> "" Then Execution.Enabled = True
End If
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsRefCheck(TextBox2.Value) Then
Cancel = True
Else
If TextBox1.Value <> "" Then Execution.Enabled = True
End If
End Sub
脱線してしまいましたし、まだ、課題は残ると思いますが・・
参考まで
色々アドバイス頂いてありがとうございます。
Qchan1962さんのコードが難しく感じていまして、中々解読できないでいます。
時間があった際に、頑張って解読してみようと思います。
No.4
- 回答日時:
こんにちは
[](Evaluateの短縮形)内では、演算は使えません。
ですので、No2様の回答のようにすれば評価可能になりますね。
別法として、普通にエラー処理を行う方法をご参考までに。
On Error Resume Next
Set r = Union(Range(TextBox1.Value), Range(TextBox2.Value))
If Err.Number <> 0 Then MsgBox "参照エラー": Exit Sub
On Error GoTo 0
No.3
- 回答日時:
正しい文字列を予め決めておくのはダメなのでしょうか。
例えば
英字(1~4桁)+数字(1~5桁)
のようにきめて、上記の条件にマッチする文字であればOKとするとか。
No.2
- 回答日時:
こんにちは
RefEditなんてものもあるけれどModeless不可だったり、そもそも選択するのは仕様が違うのかも・・
[IsRef(TextBox1.Value)] = True
WorksheetFunctionにないようなので 添付図
Evaluateを使って
If Evaluate("ISREF(" & TextBox1.Value & ")") = True And Evaluate("ISREF(" & TextBox2.Value & ")") = True Then
こんな感じでどうでしょう
ORになっているようですけれど、両方Andではないでしょうか?
範囲を制限するロジックは必要ないかな・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/20 14:46
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
VBAのTextBoxに半角数字のみ入力したい
Visual Basic(VBA)
-
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
-
4
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
5
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
6
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
7
EXCEL VBA ListViewについて
Excel(エクセル)
-
8
Excel VBA ユーザーフォーム内のラベルにテキストボックスの小計を出す方法
Visual Basic(VBA)
-
9
ブック名、シート名を他のモジュールからも参照可能にする方法
Access(アクセス)
-
10
VBAのフォームでTextBoxがいっぱいある時
Access(アクセス)
-
11
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
12
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
13
エラー内容が分かりません
Access(アクセス)
-
14
XL:BeforeDoubleClickが動かない
その他(プログラミング・Web制作)
-
15
ユーザーフォームのテキストボックスに前回入力した値を表示する Excel
Visual Basic(VBA)
-
16
VBAにて読み込みが出来ない環境依存文字 ㉖ の文字コードを教えて下さい。
Excel(エクセル)
-
17
VBA。複数のChangeイベントをまとめる方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
switch の範囲指定
-
VBAでループ内で使う変数名を可...
-
EXCEL VBA マクロ 実行する度に...
-
月度は何て読みますか?
-
UMLでの例外処理
-
C言語 b += a ? 1 : 0; の意味
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
Do~Loopした回数をカウントしたい
-
リョウ・・・量?料?
-
C# 画面のちらつきを解消したい
-
_tfopen について教えてください
-
2重のDo~Loopは?
-
【Excel】特定の文字を含むセル...
-
インタラクティブの反対語は?
-
Select Case文でこのようなこと...
-
コンボボックスの値判定
-
生活保護受給者は性欲をどんな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
UMLでの例外処理
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
メルカリのメルカードで買い物...
-
インタラクティブの反対語は?
-
月度は何て読みますか?
-
【Excel】特定の文字を含むセル...
-
findは動くがfindnextがマクロ...
-
VBの質問#if 0 then ってどう...
-
リョウ・・・量?料?
-
お家デートをしててハグを長い...
-
VB.NET Excelを読み込んでDataT...
-
iD
-
Do~Loopした回数をカウントしたい
-
FFTの結果ついて
-
2重のDo~Loopは?
おすすめ情報
回答ありがとうございます。
早速試しましたが、今度はTextBox1又はTextBox2が空白だった場合、If Evaluate・・・で「型が一致しません」と出てしまいます。
ひとまずは、fujillinさんのコードで対処してみたいと思います。
ただ、片方が空白だった場合のエラー処理やファイル名のアンダーバー「_」をどうするかが、問題となっているところです。