マクロ初心者なので教えて頂けるとうれしいです。

保存先フォルダにファイル名を自動で名前をつけて保存させるところまでできたのですが、

保存先フォルダに同名フォルダがある場合に、
もともと指定しているファイル名のお尻に連番をつけていくようにしたいのですが・・・

例)
選択したシートをコピーして、
「A1+B1+見積書.xls」
という名前をつけて毎回保存していくのですが、
同名のファイルがある場合、
「A1+B1+見積書+1.xls」
「A1+B1+見積書+2.xls」
「A1+B1+見積書+3.xls」
   …というふうにお尻に自動で連番をつけて
保存できるようにしたいのです。

宜しくお願い致します!

A 回答 (2件)

おしりに付ける数字が1桁では9までしか付けられません。


9のあと10にすることも出来ますが、ファイル名でソートしたとき
見づらいと思います。
そこで数字を3桁、001,002,003....と付けていく例です。

Sub sample()
Dim fCount As Integer
Const outPath As String = "c:\temp\"
Dim kFileName As String

kFileName = Cells(1, 1).Value & Cells(1, 2).Value & "見積書"
If Dir(outPath & kFileName & ".xls") = "" Then
ActiveWorkbook.SaveAs (outPath & kFileName & ".xls")
Else
For fCount = 1 To 999
If Dir(outPath & kFileName & Right("00" & CStr(fCount), 3) & ".xls") = "" Then
ActiveWorkbook.SaveAs (outPath & kFileName & Right("00" & CStr(fCount), 3) & ".xls")
Exit For
End If
If fCount = 999 Then
MsgBox ("連番をこれ以上付けることが出来ません。")
End
End If
Next
End If
End Sub
    • good
    • 1
この回答へのお礼

お礼が遅くなり申し訳ありません!
アレンジして使ってみたらうまくいきました!
ありがとうございました

お礼日時:2009/05/27 23:11

ファイルの存在は Dir関数でチェック可能です。



ソースがないので、文章の回答になりますが、
保存する前に Dir(FilePath)でファイル名が返ってくれば、既にファイルが存在するので、名前を変更(+1、+2・・・)していって、存在しないファイル名になるまで繰り返してから、ファイルを保存すればよいでしょう。

詳しくは、Dirのヘルプを参照ください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q動画ファイル名に連番付与

こんにちは いつもお世話になっています。

 動画ファイル名に連番を付ける方法、ソフトを教えてください。
エクセルのA列に連番、B列に動画ファイル名があります。
実際に連番を付けたい動画ファイルのファイル名には、上記のB列の動画ファイル名が入っています。この動画ファイル名にエクセル上での連番に対応させて、連番を頭に付け加えたいのです。
 わかりにくい表現ですみません、つまり、単に連番にするのではなく、エクセル上で設定した各ファイル名の連番を、実際のファイル名に反映させたいのです。

 よろしくお願いします。

Windows7、エクセル2010

Aベストアンサー

マクロは、Book1.xlsxをマクロ御用達ブックに変更し、ソコにセットアップ
Renameしたファイル名は、単純にモディファイヤ(プリフィックス)+元のファイル名
Book1.xls?をネタがあるフォルダに移動
以上、デス、、、

QACCESSで日付ごとに自動連番(日付+連番)する方法

ACCESSで日付ごとに自動連番(日付+連番)する方法

ACCESSとvba、共に初心者です。

ACCESS2003を使用しています。日付ごとに自動連番する方法が知りたくいろいろ調べていたところ過去ログ(http://oshiete.goo.ne.jp/qa/726921.html)のベストアンサーさんの回答にたどりつきました。
とりあえず勉強と思い紹介されている通りにテーブル作成からフォームのレコード移動時へのコード貼り付けまで一通り行ってみましたが、自動連番とならず同じ番号のままとなってしまいます。(日付はパソコンの日付更新時にちゃんと反映されています。)
自動連番されないのは何が原因なのでしょうか。どなたかご教授の程よろしくお願いします。


例)DATEが5月5日の場合のIDへの記載値
 0505001
 0505001←ここが001のまま0505002にしたい。
 0506001←日付が変われば0506(5月6日)に変わる。

以上、よろしくお願いいたします。

Aベストアンサー

No4 です。

すみません。もう1カ所、テキスト型の書き方に変えなければいけないところがありました。

> If IsNull(MaxID) Then
>   Me.ID.DefaultValue = AutoID & "001"
> Else
>   Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
> End If

If IsNull(MaxID) Then
  Me.ID.DefaultValue = "'" & AutoID & "001" & "'"
Else
  Me.ID.DefaultValue = "'" & AutoID & Format(Right(MaxID, 3) + 1, "000") & "'"
End If

既定値に数値型で書き込んでいますから
結局、頭のゼロが失われています。

なお、No2 さんへの補足で

> 6.[自動採番月日TBLF]の[ID]プロパティの書式に0000000を記入(一桁月の場合、頭の0が消えて6桁表示となるため。)

とありますが、
書式は、見せる形だけで、実際の値は変わりません。
書式は削除してください。
問題を分かりにくくするだけです。

No4 です。

すみません。もう1カ所、テキスト型の書き方に変えなければいけないところがありました。

> If IsNull(MaxID) Then
>   Me.ID.DefaultValue = AutoID & "001"
> Else
>   Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
> End If

If IsNull(MaxID) Then
  Me.ID.DefaultValue = "'" & AutoID & "001" & "'"
Else
  Me.ID.DefaultValue = "'" & AutoID & Format(Right(MaxID, 3) + 1, "000") & "'"
End If

既定値に数値型で書き込んでいますから
結局、頭のゼロ...続きを読む

Q特定条件での連番の振り方を教えて下さい

以下のようなテーブルがあります。

納品データ
注文番号 売上番号 連番 商品名
11111    2      1   さしすせそ
11111    2      2   たちつてと 
11111    3      1   なにぬねの
11111    4      1   はひふへほ

売上データ(既存データ)
注文番号 売上番号 連番 商品名
11111    1       1   あいうえお
11111    1       2   かきくけこ

注文番号は注文毎に付与される番号
売上番号は発送毎に付与される番号
連番は売上番号毎に付与される連番

毎回 納品データを売上データに取り込みます。

連番に関しては、
納品データと売上データで連番は連動しておらず、
売上データに納品データと同等の注文番号があれば、
注文番号の最大連番数を+1した番号で取り込みます。


更新後、売上データは、
注文番号 売上番号 連番 商品名
11111    1       1   あいうえお(既存データ)
11111    1       2   かきくけこ(既存データ)
11111    2       3   さしすせそ
11111    2       4   たちつてと
11111    4       5   なにぬねの
11111    5       6   はひふへほ

としたいのです。


SELECT
(SELECT 納品データ.連番+(SELECT NVL(MAX(売上データ.連番),0) FROM 売上データ
WHERE 売上データ.注文番号 = 納品データ.注文番号) AS 連番)
FROM 納品データ

で売上データの連番+1はできたのですが、
売上番号が違う場合は、連番が1になるパターンとなり、

納品データ
注文番号 売上番号 連番 商品名
11111    2       1   さしすせそ
11111    2       2   たちつてと 
11111    3       1   なにぬねの ←
11111    4       1   はひふへほ ←

上記SQLですと、
更新後、売上データは、

注文番号 売上番号 連番 商品名
11111    1       1   あいうえお(既存データ)
11111    1       2   かきくけこ(既存データ)
11111    2       3   さしすせそ
11111    2       4   たちつてと
11111    4       3   なにぬねの ← 5にしたい
11111    5       3   はひふへほ ← 6にしたい

となり、連番となりません。

どのようにSQLを書けばよいのか、困っています。
どうか、ご教示お願い致します。

以下のようなテーブルがあります。

納品データ
注文番号 売上番号 連番 商品名
11111    2      1   さしすせそ
11111    2      2   たちつてと 
11111    3      1   なにぬねの
11111    4      1   はひふへほ

売上データ(既存データ)
注文番号 売上番号 連番 商品名
11111    1       1   あいうえお
11111    1       2   かきくけこ

注文番号は注文毎に付与される番号
売上番号は発送毎に付与される番号
連番は売上番号毎に...続きを読む

Aベストアンサー

こういうことでしょうか。

insert into 売上データ (
注文番号, 売上番号, 連番, 商品名
)
select
注文番号
, 売上番号
, ROW_NUMBER() over(partition by 注文番号 order by 売上番号, 連番) + (select COUNT(*) from 売上データ T2 where T1.注文番号 = T2.注文番号) 連番
, 商品名
from 納品データ t1;

ROW_NUMBER()で納品データ内での連番を振って、その連番に既存データの件数を足しています。
MAX(連番)だと、同一注文番号が既存データに存在しない時にNULLになってしまうので、COUNTで件数を取るようにしています。

QAccessで、フォームAからダイアログモードで立ち上げたフォームBを開き、フォームBを閉じた時にフォームA側でマクロを実行したい

タイトルのままなのですが、

フォームA(メインとなる画面)と
フォームB(コードの検索画面)があり、
フォームAからフォームBをダイアログモードで開いている状態から、
フォームBを閉じたときに、フォームA側でマクロを実行したいと思っています。

具体的には、フォームAにコード入力用のテキストボックスがあり、コード検索のためにフォームBを立ち上げ、コードを選択した後フォームAのテキストボックスにそのコードを入れて、そのコードの値を元にフォームAにあるコンボボックスの再クエリを行いたいのです。

コンボボックスの再クエリの方法等は理解しているのですが、
上記のような場合に、どのイベントがキックされるのかが分かりません。
どのようにすれば(どのイベントを選んでマクロを指定すれば)適切に実行できるでしょうか。

Aベストアンサー

フォームBの処理
「値の代入」
「オブジェクトの選択」
  オブジェクトの種類:フォーム
  オブジェクト名:フォームA
「再クエリ」
  コントロール名:コンボボックス名
でいかがでしょうか?

QACCESSの自動連番について

ACCESS2000を使っています。
自動連番を通常すると1・2・3・・・と自動で連番を作成してくれますが、それを日付+連番というものに出来ますでしょうか?
例)1210001
  1210002
  |
  1210100
日付は月と日にちで、連番は3桁です。
数字の連番の方は、日付が変わるとまた1に戻るようにしたいです。
何か良い方法があったら教えてください。

Aベストアンサー

入力フォームのデザインで、メニューら[表示]-->[プロパティ]で「レコード移動時」欄を
クリックし、右端の ... をクリックして、「コードビルダ」で開いたウィンドウに下記
コードを貼り付けます。

レコードソースになっているテーブル名を「自動採番月日TBL」とし、自動採番する
フィールドは、数値型で名前を「ID」とした場合です。

これで、ご希望通りの動作になると思いますが、年が入っていないのが気になります。
このままでは、1年以上使っていると、昨年の番号の連番を取得します。
年を考慮することをお勧めします。

Private Sub Form_Current()
If Me.NewRecord = False Then Exit Sub
Dim AutoID As String
Dim MaxID As Variant
AutoID = Format(Date, "mmdd")
MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID)
If IsNull(MaxID) Then
  Me.ID.DefaultValue = AutoID & "001"
Else
  Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
End If
End Sub

入力フォームのデザインで、メニューら[表示]-->[プロパティ]で「レコード移動時」欄を
クリックし、右端の ... をクリックして、「コードビルダ」で開いたウィンドウに下記
コードを貼り付けます。

レコードソースになっているテーブル名を「自動採番月日TBL」とし、自動採番する
フィールドは、数値型で名前を「ID」とした場合です。

これで、ご希望通りの動作になると思いますが、年が入っていないのが気になります。
このままでは、1年以上使っていると、昨年の番号の連番を取得します。
年を考慮...続きを読む

Q【VBA】「時間+日付.xls」ファイルの作成

vbaで
「Shell ("cmd /C copy """ & 」を使用し、
今日の日付と時間を名前にしたエクセルファイル( Time$ & Time$ をファイル名にして)を作成しているのですが

Date$ →2009-05-12
は、エラーになることなくファイルが作成できるのですが
Time$→16:00:24
は、↑の様に「:」が入ってしまう為エラーになってしまいます。


VBAを使って現在の「時間+日付.xls」を作成するにはどうしたらよいでしょうか?

ちなみにnow$はライブラリにすらありませんでした。
ご教授よろしくお願いします。

Aベストアンサー

 ファイル名にコロンは使えないと存じます。

Date$ & " " & Replace(Time, ":", ".")
のようにコロンをピリオドなどに変換されてはいかがでしょうか?

Qirvineの連番機能とは

最近ダウンロード支援ソフトのirvineを利用し始めたのですが、連番でのDLの仕方が分からなく困っています。
irvineのヘルプにも連番でDLできるとは書いてあったのですが、詳しいことは書いておらず、どこをどう操作すれば連番でDLできるかがわかりません。
iria&irvine用の連番URLの作成ソフトなどがあると聞きましたが、irvine自体に連番機能があると聞くのでもしよろしければ教えていただけないでしょうか?

Aベストアンサー

こういうことでよろしいでしょうか。

以下のページから引用。
--------------------------------------------------
また、連番ファイル(例えばtest01.zip/test02.zip/・・・/test20.zip)をDLするときは
メモ帳などで「http://www.host.ne.jp/~your/test[01-20].zip」と連番部分を”[ ]”などで囲んで書き、
そのURLをコピーし、Iriaで「編集」-「URLを展開して貼り付け」を選ぶと
一気にDLするファイルが登録されます。
--------------------------------------------------

参考URL:http://www.geocities.co.jp/SiliconValley-Cupertino/1635/download.html

QAccessでデータに連番をつけたい

Accessで、ひとつの親番号に対していくつかの子番号
をひもつけて管理したいと考えています。

例:
親番号 AAA BBB CCC
子番号 001、002、003

→AAA-001、
 AAA-002・・・

 BBB-001、
 BBB-002・・・
というふうに管理する。

そこで、データの新規登録時に親番号を取得後、フォーム上でボタンを押すと自動的に「親-子」という形になるようにしたいのですが、どうすればよいでしょうか?

イベントプロシージャがなかなかうまく行かず・・。
お助けください!

Aベストアンサー

こんばんは。

例えば下記↓のようなコードでいかがでしょうか?
(前提)
フォームに非連結の「親」と「親-子」コントロールがあります。
テーブルに「親-子」フィールドがあります。
フォームの「親」を入力すると「親-子」に値が表示されます。

Private Sub 親_AfterUpdate()
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Set Cn = CurrentProject.Connection
Set Rs = New ADODB.Recordset
Rs.CursorLocation = adUseClient
Rs.Open "テーブル1", Cn, adOpenDynamic, adLockOptimistic
Rs.Sort = "[親-子] DESC"
Rs.Find "[親-子] like '" & Me![親] & "*'"
If Rs.EOF Then
Me![親-子] = Me![親] & "-" & "001"
Else
Me![親-子] = Me![親] & "-" & Format(Val(Right(Rs![親-子], 3)) + 1, "000")
End If
Rs.Close: Set Rs = Nothing
Cn.Close: Set Cn = Nothing
End Sub

> イベントプロシージャがなかなかうまく行かず・・。
どこが分からないのか明確でないのでコメントは入れてません。
もし、分からない箇所がありましたらご指摘くださいね。

こんばんは。

例えば下記↓のようなコードでいかがでしょうか?
(前提)
フォームに非連結の「親」と「親-子」コントロールがあります。
テーブルに「親-子」フィールドがあります。
フォームの「親」を入力すると「親-子」に値が表示されます。

Private Sub 親_AfterUpdate()
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Set Cn = CurrentProject.Connection
Set Rs = New ADODB.Recordset
Rs.CursorLocation = adUseClient
Rs.Open "テーブル1", Cn, adO...続きを読む

Qエクセルでの連番のつけ方

エクセルで
各人の研修講座の受講歴を連番で登録していきます。
毎月、データを追加していきます。

初期値(=前月までの登録値)
日本さん No5
世界さん No8
東京さん No1
のときに

日本さん 「講座A」
日本さん 「講座B」
日本さん 「講座C」
日本さん 「講座D」

世界さん 「講座A」
世界さん 「講座D」

東京さん 「講座A」
東京さん 「講座B」
東京さん 「講座E」
東京さん 「講座F」
東京さん 「講座G」

を登録する場合、

日本さん 「講座A」連番No6 
日本さん 「講座B」連番No7
日本さん 「講座C」連番No8
日本さん 「講座D」連番No9

世界さん 「講座A」連番No9
世界さん 「講座D」連番No10

東京さん 「講座A」連番No2
東京さん 「講座B」連番No3
東京さん 「講座E」連番No4
東京さん 「講座F」連番No5

と連番を振りたいのですが、よい方法が浮かびません。

今月の最初の番号として、初期値+1を当てはめ、
名前順にソートして、
上下で「EXACT」で、
「FALSE」のときは、そのまま
「TRUE」のときは、手で修正
のようなことをやっていますが、
関数で、より簡単にできる方法は
ありませんか?
できれば、マクロは使用しないほうが良いですが、
やむを得ない場合は、構いません。
宜しくお願いします。

エクセルで
各人の研修講座の受講歴を連番で登録していきます。
毎月、データを追加していきます。

初期値(=前月までの登録値)
日本さん No5
世界さん No8
東京さん No1
のときに

日本さん 「講座A」
日本さん 「講座B」
日本さん 「講座C」
日本さん 「講座D」

世界さん 「講座A」
世界さん 「講座D」

東京さん 「講座A」
東京さん 「講座B」
東京さん 「講座E」
東京さん 「講座F」
東京さん 「講座G」

を登録する場合、

日本さん 「講座A」連番No6 
日本...続きを読む

Aベストアンサー

こんにちは!

やり方だけ・・・
↓のような配置だとします。
No○ のセルはセルの表示形式のユーザー定義から
"No"0
としておき、数値データだけの入力とします。
まず、E・F列に初期値を表示させておきます。

そしてC2セルに
=IF(A2="","",COUNTIF(A$2:A2,A2)+IF(COUNTIF(E:E,A2),VLOOKUP(A2,E:F,2,0)))
という数式を入れフィルハンドルで下へコピーすると
画像のような感じになります。m(_ _)m

Q単一セル内の文字(例:「ab」の場合、a=1、b=1)数を数えたい

当番表(A列に当番の種別、B1~W1に時間、Y列、Z列、AA列に当番に従事した回数の合計)を作りたいと思います。

この時、COUNTIF関数を使って数えようと思いましたが、2人で担当した時間の場合(下表の「C2」「C3」)Y~AAに回数をそれぞれ振り分けるには、どうすればよいのでしょうか。教えて下さい。お願いします。

できれば関数でお願いしたいのですが、これに代わるもの例えばマクロでも結構です。

A | B | C | … | Y | Z | AA |
--------------------------
1|種別|10:30 |11:30 | … | a | b  |  c |
---------------------------
2|清掃| a  | bc | … | 1 | 1  | 1  |
---------------------------
3|受付| b  | ab | … | 1 | 2  | … |

Aベストアンサー

rondoさん 再び こんばんは(^^;

>早速試してみまると…。で、できました。うれし~!
よかたですね! 喜んで頂きなによりです!

>更に解説までお願いしてよろしいでしょうか。
説明下手ですが・・・少々!
(意味が不明の箇所がありましたら追記下さい)

ご質問にも記載があるので 関数 COUNTIF() はご存知
のようですから構文自体は簡単に!

 COUNTIF(範囲, 検索条件)

ご存知の様に検索条件に合致するデータの個数を返す関数です。

 問題は検索条件の記載ですが、これには

1.数値を検索する場合 符合付きの記載が可能
2.文字列を検索する場合 ワイルドカードの記載が可能

です。
今回の場合、対象が文字列ですから2番の方法を利用しています。

=COUNTIF($B2:$W2,"*"&Y$1&"*")

この式の検索条件部分は "*"&Y$1&"*" の数式ですが
この数式結果は、文字"*" と Y1 と "*" を繋げた
ものですから "*a*" となります。
(文字と文字を繋げる数式は & を使います)

結果、数式は =COUNTIF($B2:$W2,"*a*") と読み替えられます!

ワイルドカードの意味ですが
「*」文字数0を含む全ての文字列

 *a は 文字列末に a が含まれている ba ○ ab × a ○
 a* は 文字列頭に a が含まれている ba × ab ○ a ○
*a* は 文字列の何処かに a が含まれている ba ○ ab ○ a ○

 となります。Z列やAA列の bやcについても同じです

今回は使いませんが、「?」というワイルドカードもあります
 これは「?」一つで1文字を示しています。
 a? は 文字列頭に a が含まれaの次に1文字ある
 ba × ab ○ a × abc ×

これらを組み合わせると様々な検索が可能で
 住所録から 東京都*区* で検索すれば東京都の23区の住所だけが検索されます。
 ???県* とすれば3文字の県名だけが検索されます。 

詳しくは、ヘルプでワールドカードと入力して表示された
[文字列または数値の検索に使用できるワイルドカード文字]
を見てみて下さい!

rondoさん 再び こんばんは(^^;

>早速試してみまると…。で、できました。うれし~!
よかたですね! 喜んで頂きなによりです!

>更に解説までお願いしてよろしいでしょうか。
説明下手ですが・・・少々!
(意味が不明の箇所がありましたら追記下さい)

ご質問にも記載があるので 関数 COUNTIF() はご存知
のようですから構文自体は簡単に!

 COUNTIF(範囲, 検索条件)

ご存知の様に検索条件に合致するデータの個数を返す関数です。

 問題は検索条件の記載ですが、これには

1....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報