[[20140130180201]] 『Excelフォーマット内のデータを別指定ファイルへメx(ももも) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Excelフォーマット内のデータを別指定ファイルへデータ抽出』(ももも)

いつも大変勉強させていただいております。

過去質[[20140109021929]]に引き続く質問ですが、質問内容が変わってきましたので別途質問いたします。コードの一部変更で問題解決できそうなのですが、いかんせんどこをどう変更すればよいものかまったくわかりませんのでお力添えお願いいたします。

Mook様に、以下のような作業をするマクロ(コードはこの質問の最下部に記載)を作っていただきました。
{作業内容}
1、フォルダA内にある複数のファイル(同一フォーマットのエクセルファイル)から指定箇所を別ファイル(以下抽出ファイルとする)に書き出す。
2、フォルダAにエクセルファイルを追加した場合、追加ファイルからのみデータが抽出され、抽出ファイルの最下行から追加される。
3、その他の細かい設定は過去質を見ていただければ流れをわかっていただけると思うので割愛。

で、過去のファイルから一気に抽出する作業を終えた後に、今後増えていくファイルは
こちらのコードの一部を変更して、以下のようにしたい。
[変更内容]
1、フォルダAからの抽出ではなく、各指定ファイルからの抽出にしたい。(たとえば「今開いているエクセルファイルから抽出」というような設定にしたい)
  (各ファイルは同一フォルダ内に存在せず、点在)
2、ただし追加して抽出するファイルのデータは抽出ファイルの最下行に追加される形は残したい。
3、そのほかの細かい設定はそのまま残したい。

Mook様に作っていただいた「フォルダから一括抽出を実行する」コードが以下です。少し長いですが、わかる人が見ればこちらを見たほうがわかりやすいかと思いますので記載します。

お力添えよろしくお願いいたします。

 Option Explicit

 '// Option Definition

 '// 1) Make File Link
 '//----------------
  Public Const MAKE_LINK = True

 '// 2) Separate Multiple Cell Data
 '//----------------
  Public Const SEPARATE_MODE = True

  '// Multiple data delimiter
  '// Available in [SEPARATE_MODE = False]
  Public Const DELIMITER = vbLf     ' // 区切り文字指定 : セル内改行
 'public Const DELIMITER = ","

 '-----------------------------
 Sub MakeDataList()
 '-----------------------------
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim dataWS As Worksheet
    Set dataWS = ActiveSheet

    Dim folderPath
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show <> True Then Exit Sub
        folderPath = .SelectedItems(1)
    End With

    Dim dstRow As Long
    Dim dstCol As Long
    Dim lastCol As Long

    dstRow = dataWS.Cells(Rows.Count, "A").End(xlUp).row + 1
    If dstRow < 3 Then dstRow = 3

    lastCol = dataWS.Range("B2").End(xlToRight).Column
    If lastCol = Columns.Count Then
        MsgBox "Data definition is not valid"
        Exit Sub
    End If

    Dim file
    Dim mData
    Dim i As Long
    Dim dataNum As Long
    Dim multipleDataMax As Long
    Dim colDic
    Set colDic = CreateObject("Scripting.Dictionary")
    Dim colKey

    '// Check multiple data column
    For dstCol = 2 To lastCol
        If InStr("{[$", Left(dataWS.Cells(2, dstCol).Value, 1)) = 0 Then
            If Range(dataWS.Cells(2, dstCol).Value).Cells.Count > 1 Then
                colDic(dstCol) = dataNum
            End If
        End If
    Next

    For Each file In fso.GetFolder(folderPath).Files
        If dataWS.Columns("A:A").Find(file.Name, LookAt:=xlWhole) Is Nothing Then
            With Workbooks.Open(folderPath & "\" & file.Name)
                If MAKE_LINK = True Then
                    dataWS.Hyperlinks.add Anchor:=dataWS.Cells(dstRow, "A"), _
                        SubAddress:=.Worksheets(1).Name & "!A1", _
                        Address:=folderPath & "\" & file.Name, _
                        TextToDisplay:=file.Name
                Else
                    dataWS.Cells(dstRow, "A").Value = file.Name
                End If
                multipleDataMax = 0
                For dstCol = 2 To lastCol
                    dataWS.Cells(dstRow, dstCol).Value = getDataFromWS(.Worksheets(1), dataWS.Cells(2, dstCol).Value, dataNum)
                    If dataNum > multipleDataMax Then multipleDataMax = dataNum
                Next
                .Close savechanges:=False

                '// Multi Data Column Processing
                If SEPARATE_MODE = True And multipleDataMax > 1 Then
                    For i = 1 To multipleDataMax - 1
                        dataWS.Rows(dstRow).Copy dataWS.Rows(dstRow + i)
                    Next
                    For Each colKey In colDic.keys
                        mData = Split(dataWS.Cells(dstRow, colKey).Value & Application.Rept(DELIMITER, multipleDataMax), DELIMITER)
                        For i = 0 To multipleDataMax - 1
                            dataWS.Cells(dstRow + i, colKey).Value = mData(i)
                        Next
                    Next
                    dstRow = dstRow + multipleDataMax
                Else
                    dstRow = dstRow + 1
                End If
            End With
        End If
    Next
 End Sub

 '-----------------------------
 Function getDataFromWS(ws As Worksheet, srcAddr As String, ByRef dataNum As Long)
 '-----------------------------
    Dim cellAddr As String
    Dim cbCaption As String
    Dim cbName As String
    Dim dc As Range
    Select Case True
    Case InStr(srcAddr, "[") = 1
        cellAddr = Replace(Replace(srcAddr, "[", ""), "]", "")
        getDataFromWS = _
            getFormCheckBoxCenterPosInCell(ws.Range(cellAddr))
    Case Else
        getDataFromWS = ""
        dataNum = 0
        For Each dc In ws.Range(srcAddr)
            If dc.Value <> "" Then
                getDataFromWS = getDataFromWS & IIf(dataNum > 0, DELIMITER, "") & dc.Value
                dataNum = dataNum + 1
            End If
        Next
    End Select
 End Function

 '-----------------------------
 Function getFormCheckBoxCenterPosInCell(cbCell As Range)
 '-----------------------------
    Dim cpx As Double
    Dim cpy As Double
    Dim zorder As Long

    zorder = -1
    getFormCheckBoxCenterPosInCell = "Not Found"
    Dim cb As CheckBox
    For Each cb In cbCell.Parent.CheckBoxes
        cpx = cb.Left + cb.Width / 2
        cpy = cb.Top + cb.Height / 2
        If cpx > cbCell.Left And cpx < (cbCell.Left + cbCell.Width) _
        And cpy > cbCell.Top And cpy < (cbCell.Top + cbCell.Height) Then
            If cb.zorder > zorder Then
                getFormCheckBoxCenterPosInCell = IIf(cb.Value > 0, True, False)
                zorder = cb.zorder
            End If
        End If
    Next
 End Function

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 少しあいまいなところもありますが、現在開いているEXCEL ファイルを対象に
 集計をしたいということと解釈しました。

 下記を追記して、使い分けてはどうでしょうか。

 '-----------------------------
 Sub MakeDataList_OpenWBs()
 '-----------------------------
    Dim dataWS As Worksheet
    Set dataWS = ActiveSheet

    Dim dstRow As Long
    dstRow = dataWS.Cells(Rows.Count, "A").End(xlUp).Row + 1
    If dstRow < 3 Then dstRow = 3

    Dim lastCol As Long
    lastCol = dataWS.Range("B2").End(xlToRight).Column
    If lastCol = Columns.Count Then
        MsgBox "Data definition is not valid"
        Exit Sub
    End If

    Dim colDic
    Dim dataNum As Long
    Set colDic = CreateObject("Scripting.Dictionary")
    '// Check multiple data column
    Dim dstCol As Long
    For dstCol = 2 To lastCol
        If InStr("{[$", Left(dataWS.Cells(2, dstCol).Value, 1)) = 0 Then
            If Range(dataWS.Cells(2, dstCol).Value).Cells.Count > 1 Then
                colDic(dstCol) = dataNum
            End If
        End If
    Next

    Dim wb As Workbook
    Dim mData
    Dim i As Long
    Dim multipleDataMax As Long
    Dim colKey
    For Each wb In Application.Workbooks
        If dataWS.Columns("A:A").Find(wb.Name, LookAt:=xlWhole) Is Nothing _
          And wb.Name <> ThisWorkbook.Name Then
            With wb
                If MAKE_LINK = True Then
                    dataWS.Hyperlinks.Add Anchor:=dataWS.Cells(dstRow, "A"), _
                        SubAddress:=.Worksheets(1).Name & "!A1", _
                        Address:=.Path & "\" & .Name, _
                        TextToDisplay:=.Name
                Else
                    dataWS.Cells(dstRow, "A").Value = .Name
                End If
                multipleDataMax = 0
                For dstCol = 2 To lastCol
                    dataWS.Cells(dstRow, dstCol).Value = getDataFromWS(.Worksheets(1), dataWS.Cells(2, dstCol).Value, dataNum)
                    If dataNum > multipleDataMax Then multipleDataMax = dataNum
                Next

                '// Multi Data Column Processing
                If SEPARATE_MODE = True And multipleDataMax > 1 Then
                    For i = 1 To multipleDataMax - 1
                        dataWS.Rows(dstRow).Copy dataWS.Rows(dstRow + i)
                    Next
                    For Each colKey In colDic.keys
                        mData = Split(dataWS.Cells(dstRow, colKey).Value & Application.Rept(DELIMITER, multipleDataMax), DELIMITER)
                        For i = 0 To multipleDataMax - 1
                            dataWS.Cells(dstRow + i, colKey).Value = mData(i)
                        Next
                    Next
                    dstRow = dstRow + multipleDataMax
                Else
                    dstRow = dstRow + 1
                End If
            End With
        End If
    Next
 End Sub
(Mook) 2014/01/31(金) 18:34

Mook様

ありがとうございます!
個別のファイルからの抽出思っていたようにできました!

ついでといっては何なのですが、もう2点質問です。

コードを試しながらいろいろエクセルの改善をしていくうちに抽出できるときとできないときがあり、下記の2つの疑問がわいてきました。どこが原因か知りたいので教えてください。

今のコードは2行目にセル指定位置を入力し3行目以下にデータが抽出されるようになっているのですが

質問1
このコードの場合、セル指定の行に空白があると抽出されなくなりますか?
たとえばB3,C3,D3,E3とセル指定が入っていて、F3,G3にセル指定がなく、H3以降またセル指定がある場合データが抽出できなくなったりしますか?
またこのセル指定している3行目に何かしらセル番号以外の文字などが入っているとエラーになったりしますか?

質問2
5行目にセル指定の値を入力し、6行目からデータが入るようにしたい場合はどこをかえたらできますか? 上記のコードでやってから行追加して調整も考えたのですが、そうすると見た目がものすごくごちゃごちゃして整理するのも一苦労なのでできれば最初の時点で調整したい。その際に質問1の問題が生じるのかなという疑問がうかびました。

回答よろしくお願いいたします。

ももも

(ももも) 2014/02/01(土) 00:25


 >このコードの場合、セル指定の行に空白があると抽出されなくなりますか?
 なります。
 最終位置を求めているのは、
   lastCol = dataWS.Range("B2").End(xlToRight).Column
 ですが、これは B2 にカーソルを置いて Ctl+→ を押したのと同じ処理です。
 ですので、空白があるとそこまでになります。

 >またこのセル指定している3行目に何かしらセル番号以外の文字などが入っているとエラーになったりしますか?
 なります。
 データを読んでいるのは、
     ws.Range(srcAddr)
 ですが、srcAddr(これがセルに書いたセル位置)がセルを指定するアドレスでない場合
 エラーになります。
 チェックボックスの [xx] は自分で決めた書式ですから、これ以外の想定しない文字は
 エラーになります。

 >5行目にセル指定の値を入力し、6行目からデータが入るようにしたい場合はどこをかえたらできますか?
 シートが空の時に、最低行数を決めているのは、
    If dstRow < 3 Then dstRow = 3
 です。
 5行目からにしたければ、
    If dstRow < 5 Then dstRow = 5
 にしてください。

 興味を持ったところから少しずつでも良いので、コードを理解していくとよいかと思います。
(Mook) 2014/02/01(土) 01:07

Mook様

ご回答ありがとうございます。
参考にして早速試してみたいと思います。

コードはまだまだ初歩中の初歩を理解し始めたところです。Range("B2")がどういう意味かというところからほんとに亀の歩みで勉強中です。
まだまだ道のりは遠いですね。

ももも
(ももも) 2014/02/03(月) 16:49


Mook様

早速

 >5行目にセル指定の値を入力し、6行目からデータが入るようにしたい場合はどこをかえたらできますか?
 シートが空の時に、最低行数を決めているのは、
    If dstRow < 3 Then dstRow = 3
 です。
 5行目からにしたければ、
    If dstRow < 5 Then dstRow = 5

部分を参考にして、
5行目をセル指定行、6行目からデータが入るように
If dstRow < 6 Then dstRow = 6

としてやってみたのですが、うまくいかず、エラー1004 手順「オブジェクトの指定」(?)ができませんというようなメッセージが出ました。

ためしにその下の行にある
Dim lastCol As Long

    lastCol = dataWS.Range("B2").End(xlToRight).Column
    If lastCol = Columns.Count Then
        MsgBox "Data definition is not valid"
        Exit Sub
    End If

のB2の部分をB5に変えてみたのですが、それでも同じ結果で、ここをB6にするとData definition is not validと出ます。

Debugをクリックすると

  '// Check multiple data column
    For dstCol = 2 To lastCol
        If InStr("{[$", Left(dataWS.Cells(2, dstCol).Value, 1)) = 0 Then
            If Range(dataWS.Cells(2, dstCol).Value).Cells.Count > 1 Then
                colDic(dstCol) = dataNum

の部分の
If Range(dataWS.Cells(2, dstCol).Value).Cells.Count > 1 Then
ここが黄色く反転します。

これまでの状態から変更したのは1〜3行目に行を挿入(ここには各セルに文字が入っています)して、データの入る順番の一部変更ぐらいです。4行目に項目名、5行目にセル指定をいれ、セル指定する5行目には前回同様空白も文字もない状態です。6行目からデータが入るようにしたいのですが。。

考えられる原因としてどういったことがありますか?

よろしくお願いいたします。

(ももも) 2014/02/03(月) 20:12


 >5行目にセル指定をいれ
 であれば、
 lastCol = dataWS.Range("B5").End(xlToRight).Column
 でよいはずです。

 If dstRow < 6 Then dstRow = 6 
 がエラーになるとは考えづらいのですが、エラーが出たときに黄色くなったのはこの行で
 しょうか。

 If Range(dataWS.Cells(2, dstCol).Value).Cells.Count > 1 Then 
 が黄色くなるのは、
   dataWS.Cells(2, dstCol).Value
 dstCol 列の2行目がセルアドレスになっていないからで、ここを
   dataWS.Cells(5, dstCol).Value
 とする必要はありそうです。
(Mook) 2014/02/03(月) 22:56

Mook様

ありがとうございます。

If dstRow < 6 Then dstRow = 6
この部分は黄色く反転はしませんでした。
2を5に変えてやってみると今度は

        getDataFromWS = ""
        dataNum = 0
        For Each dc In ws.Range(srcAddr)

のFor Each dc In ws.Range(srcAddr)のところが反転しました。。。

なんだか複雑になってきたので、もとのままやってみようと思います。。ご迷惑おかけして申し訳ありません。。

もうひとつ別途質問です。

今のコードは抽出ファイルのアクティブシートにデータを書き出すようになっているのですが、この抽出ファイルのシート1、シート2両方に対して、同じコードを同時に実行することはできますか?
マクロの記録でマクロの実行を記録させてマクロをくっつける?方法を試してみたのですが、うまくいきませんでした。たぶんやりかたが間違っているのだと思うのですが。。コード自体をいじるのであれば

 Dim dataWS As Worksheet
    Set dataWS = ActiveSheet

このあたりをいじればよいのかなと検討してみたのですが、まだ自分ではいじれるほど理解できてません。

お知恵を拝借させていただければと思います。

よろしくお願いいたします。
(ももも) 2014/02/04(火) 00:15


 >同じコードを同時に実行することはできますか? 
 とは言っても、マクロでは順次処理することになりますので、
 それぞれの集計シートに実行ボタンをおいて、個別に実行するか、

 新たにマクロを一個追加して、
 Sub MakeDataListForMultipleSheets()
     WorkSheet("Sheet1").Activate
     MakeDataList
     WorkSheet("Sheet2").Activate
     MakeDataList
 End Sub
 とするくらいでもできそうだとは思います。
(Mook) 2014/02/05(水) 09:21

Mook様

ありがとうございます!

ボタンにするだけでも結構作業が楽になるのでボタンでやってみることにします!
(コードは試しましたが、私のやり方がまちがっていたのかうまくいきませんでした。。)

本当に何から何までありがとうございます!

徐々に形にしたいものができあがりつつあります。

あとはWordのほうのフォーマットの日付序数表示で悩み中です。
Excel上では05/01/14と入力して05January2014と表示されるようにフォーマット指定しているのですがこれを差し込み印刷でWordにとりこむと01/05/2014となってしまいます。

Word上で5th January 2014と表示させたくフィールドの編集で序数表示になるようにいろいろ調べて

{ MERGFIELD "Date Submit" \@ "d" \*Ordinal"mmmm""yyyy"}
と入力してやってみたのですがうまくいきません。。イタリア語設定のままだから無理なのでしょうか?

Wordなのでここで質問するのは場違いなのは重々承知ですが、、、何かご存知でしたら教えていただければありがたいです。よろしくお願いいたします。

ももも
(ももも) 2014/02/05(水) 23:32


 あっ、ごめんなさい。
     WorkSheet("Sheet1").Activate
 は
     WorkSheets("Sheet1").Activate
 ですね。もう一個も同様です。

 またやってしまった。

 Word の件はまた明日に。
(Mook) 2014/02/06(木) 00:43

Mook様

コードなおしたらできました!!!!ありがとうございます!
2シート同時に更新できるようになって感動!素敵です♪
ボタンの案も採用させていただいてさらにすっきり簡単になりました♪♪

Wordの件はいまだ格闘中ですが。もう一歩がんばります!!

ももも
(ももも) 2014/02/07(金) 17:27


 Word の日付の書式の件ですが、一つのフィールドでもできるのかもしれませんが
{MERGFIELD "Date Submit" \@ "d" \*Ordinal}{MERGFIELD "Date Submit" \@ "mmmm yyyy"}
 としてみてどうでしょうか。
(Mook) 2014/02/07(金) 20:17

Mook様

Wordのほうがなかなか思うようにいきません。。。
{MERGFIELD "Date Submit" \@ "d" \*Ordinal}{MERGFIELD "Date Submit" \@ "mmmm yyyy"}
(こうしてみたところ私のOfficeでは \が半角の\ に勝手に変換されます。ややこしいのでそもそもの基本言語設定の変換もこころみたのですがうまくいきませんでした。。。)

結果下記のような表示になります。(ここでは19日にしてあります。)
19° 0000

難しいですね。。。

(ももも) 2014/02/07(金) 21:41


 >\が半角の\ に勝手に変換されます。
 はそれが普通で、日本では \ マークですが、欧米ではバックスラッシュなので、
 そのままで良いと思います。

 こちらでは一応うまく出たのですが、なかなか難しいですね。
(Mook) 2014/02/07(金) 21:57

 19thはわかりませんが、0000のほうは、MMMM(大文字)でしょうか。
(マナ) 2014/02/07(金) 23:00

 なるほど、大文字小文字関係ありそうですね。
http://office.microsoft.com/ja-jp/word-help/HA010100426.aspx#BM9 現在参照不可
(Mook) 2014/02/07(金) 23:37

 ここでは日付を3つで表記しているようですので、序数と他の項目は混在できない
 ようです。
http://support.microsoft.com/kb/72571/it

 Per visualizzare
 21 Marzo 1991
 Immettere i campi:
 {date\ @ "MMMM"} {Data \ @ "d" \*ordinal}, {data \ @ "YYYY"} 

 でも文章ではオプションは \*Ordinale と書いてあるのに(自動翻訳の弊害?)、
 サンプルは Ordinal になっていたり、変数が Data や date と英語やイタリア語で
 混在していたり、\ @ の前後にスペースが入ったり、ちょっと怪しい説明です。

 英語の原文では
 {date\@ "MMMM"} {date \@ "d" \*ordinal}, {date \@ "YYYY"} 
 となっていました(\は半角の\:欧米フォントにすれば日本語環境でもバック
 スラッシュになりますけれど)。

 以前 EXCEL のSUM 関数が英語ではなくイタリア語と聞きましたが、
 英語圏以外の人は、場面々々でローカルなのか英語なのかが異なっていそうで、
 面倒そうですね。
(Mook) 2014/02/08(土) 08:14

 イタリア語では、19°ということかもしれません。 
http://ja.wikipedia.org/wiki/%E5%BA%8F%E6%95%B0%E6%A8%99%E8%AD%98
(マナ) 2014/02/08(土) 11:25

 なるほど。イタリア語では日付もその形式(上付きのo)であれば、今のでよさそうですね。

 英語式にしたいのであれば、言語設定を変えるか文字列としてデータを渡すかなど
 対応が必要かもしれません。
(Mook) 2014/02/08(土) 13:22

 正しい書き方は知らないので、参考まで。
 ↓を真似しました。
  
http://blog.mjwindsor.co.uk/2011/02/ms-word-automatic-date-fields.html
  
{ SET myD { MERGEFIELD "Date Submit" \@ "d"}
{ myD }{ 
IF {=MOD(myD,20)} = 1 
	"st" 
	"{ IF {=MOD(myD,20)} = 2 
		"nd" 
		"{IF {=MOD(myD,20)} = 3 
			"rd" 
			"{ IF myD =31 
				"st" 
				"th"
			 }"
		 }"
	 }
}{MERGEFIELD "Date Submit" \@ " MMMM YYYY" }
  

(マナ) 2014/02/09(日) 15:01


 すごい!
 フィールドの文法って、そんなに自由度高かったんですね。

 けれど、検索してもなかなか資料が見つからないのは、やはり利用する人が
 少ないからでしょうか。

 リンク先、とても参考になりました。
(Mook) 2014/02/09(日) 15:38

Mook様 マナ様

お2人とも本当にありがとうございます!!
無知が故になんだかすごく複雑なことを質問してしまったようで、本当に申し訳ありません。

教えていただいたサイトを見ながらいろいろやりくりしてみてはいるのですが、、、一筋縄ではいかないようです。イタリア語と英語と日本語のそれぞれの文字が混同してわたしの頭の中でもパニック状態でなかなか思うように調整できません。一歩進んで5歩下がるみたいな状況です。

おそらく半角一つでも異なっているとアウトなので、私のやり方が間違っているのだとは思うのですが。。。

もう少しがんばってみます。

これができたら祝杯でも上げたい気分です。

(ももも) 2014/02/10(月) 18:01


入力しやすいように、少し短くしてみました。
 スペースと"の入れ忘れに注意して下さい。↑で、私も2箇所入れ忘れています。
 {IF(スペース)myD2(スペース)=(スペース)1(スペース)"st"(スペース)…
  
{ SET myD { MERGEFIELD "Date Submit" \@ "d"}
{ SET myD2 {=MOD(myD,20)} }
{ myD }
{IF myD2  = 1 "st" "{IF myD2  = 2 "nd" "{IF myD2  = 3 "rd" "{IF myD2 = 31 "st" "th" }" }" }"}
{MERGEFIELD "Date Submit" \@ " MMMM YYYY" }

  
(マナ) 2014/02/10(月) 19:10

Mook様 マナ様

マナ様のコードはまだ試していないのですが、

頭を整理するために最初の段階に戻ってみました。
フィールドコードを
{ MERGEFIELD "Date Submit" \@ "d MMMM yyyy" }
とすると

Excelで 6/19/2014 と入力した場合 
Excel上ではフォーマット指定で 19 June 2014と表示されるようにしています。

これが Wordでは 19 giugno 2014
と表示されます。giugnoは英語のjuneです。

まずはこのイタリア語を英語に直すところからだと思っているのですが、言語を指定するコードなどもあるのでしょうか。。。

マナ様のコードも試してみます。

(ももも) 2014/02/10(月) 20:11


なるほど、そこもですか。私には、愚直に変換することくらいしか思いつきません。
  
{ SET myM { MERGEFIELD "Date Submit" \@ "M"}
{ MERGEFIELD "Date Submit" \@ "d"}
{IF myM = 1 "January" "{IF myM = 2 "February" "{IF myM = 3 …(略)
{MERGEFIELD "Date Submit" \@ " YYYY" }
  

(マナ) 2014/02/10(月) 20:40


間違えました

正しくは

19/06/2014と入力した場合Excelフォーマットで19 June 2014
Wordで19 giugno 2014 でした。

ももも
(ももも) 2014/02/10(月) 21:54


 書式を英語にしたいのであれば、EXCEL 側で日付を英語の文字列にしてしまって
 そちらを流し込んではどうでしょうか。
 EXCEL ならセルの書式に言語指定ができるので。

 X列に対象の日付があったとして、Z列に下記の式を置き、
=TEXT(X1,"[$-1009]MMMM D") & IF(OR(MOD(DAY(X1),20)=1,DAY(X1)=31),"st", IF(MOD(DAY(X1),20)=2,"nd",IF(MOD(DAY(X1),20)=3,"rd","th"))) &" " &YEAR(X1)

 Z列の方を流し込みに使ってはどうでしょうか。
 読込先は文字列として。
http://office.microsoft.com/ja-jp/excel-help/HA001034635.aspx 現在参照不可
(Mook) 2014/02/10(月) 22:03

Mook様

Mook様の方法を試してみているところで、難しいのでDay,Month,Yearでわけながら関数をやってみているのですが、、、

A1に16/02/2014と入力し、A2に
=TESTO(A1;"[$-1009]MMMM")&" "&ANNO(A1)
とすると、February 2014 とExcelで表示され、これを差し込み印刷のWordに表示させると、Excelに表示されているとおり February 2014 とできました。
なのでこの手法でできればOKかなと思ったのですが。。。

問題はDay。。。

=SE(SCEGLI(RESTO(GIORNO(A1);20)=1;GIORNO(A1)=31);"st" SE(RESTO(GIORNO(A1);20)=2;"nd"; SE(RESTO(GIORNO(A1);20)=3;"rd";"th")))

だとエラーが出てしまいます。括弧が足りないとかだと思うのですが、犯人を見つけられません。
SE=IF SCEGLI=OR RESTO=MOD GIORNO=DAY   です。(イタリア語での関数名に自信がありませんが、たぶんあってます、、、)

ももも

(ももも) 2014/02/11(火) 00:21


 まったく別の言語のようですね。って別言語か。
=SE(SCEGLI(RESTO(GIORNO(A1);20)=1;GIORNO(A1)=31);"st";SE(RESTO(GIORNO(A1);20)=2;"nd"; SE(RESTO(GIORNO(A1);20)=3;"rd";"th")))
 かな("st"のあとの ; が抜けているようです)。

 これでダメなら、VBA のユーザ定義関数という手も。
(Mook) 2014/02/11(火) 00:45

Mook様

A1に16/02/2014と入力
A2=SE(SCEGLI(RESTO(GIORNO(A1);20)=1;GIORNO(A1)=31);"st";SE(RESTO(GIORNO(A1);20)=2;"nd"; SE(RESTO(GIORNO(A1);20)=3;"rd";"th")))

とした場合、Valueエラーが出ます。
どこかにTEXT(A1,"[$-1009]MMMM D")を足す必要があるのでしょうか。

式を分解してどこが間違っているのか探しているのですが、、、、難しいです。。。。。
(ももも) 2014/02/11(火) 19:12


 >どこかにTEXT(A1,"[$-1009]MMMM D")を足す必要があるのでしょうか。 
 序数だけであればその必要はないです。

 式を置き換えた結果は正しそうですが、段階を追ってやってみてはどうでしょうか。
 A1 は例えば Ctl+として、
 A2=GIORNO(A1) とし「11」が出るでしょうか。
 A2=RESTO(GIORNO(A1);20) として 「11」 が出るでしょうか。
   (=RESTO(13;5) としたら 3 になりますか?)

 A2=SE(RESTO(GIORNO(A1);20)=3;"rd";"th") として 「th」 とでるでしょうか。
 ここまで正しく出るようなら、
 A2=SE(SCEGLI(RESTO(GIORNO(A1);20)=1;GIORNO(A1)=31);"st";SE(RESTO(GIORNO(A1);20)=2;"nd";SE(RESTO(GIORNO(A1);20)=3;"rd";"th")))
 も問題ないように思います。

 Value のエラーが出ているということは、元データの日付に問題ないでしょうか。
http://office.microsoft.com/ja-jp/excel-help/HP010342330.aspx 現在参照不可

(Mook) 2014/02/11(火) 22:47


 SCEGLIはCHOOSEみたいですよ。
 ↓で調べると ORはOのようです。
http://en.excel-translator.de/choose/
  
(マナ) 2014/02/12(水) 20:21

Mook様 マナ様

できました!!!!
わたしもさっきこの単純ミスを発見しました。
なんと「SCEGLI」ではなく「O」という単純ミスでした。
最初のころOで試してたんですが、うまくいかなかったんでいろいろ探してScegliにたどりついたんですが、最初のであってたみたいです。
本当に申し訳ないです。

ためしているうちにIFだけで無理やり作ってみたのもうまくいきました。
=SE(RESTO(GIORNO(A1);20)=1;GIORNO(A1)&"st";SE(GIORNO(A1)=31;GIORNO(A1)&"st";SE(RESTO(GIORNO(A1);20)=2;GIORNO(A1)&"nd";SE(RESTO(GIORNO(A1);20)=3;GIORNO(A1)&"rd";GIORNO(A1)&"th"))))

ちょっと長いですがw

すっきりさせるにはやっぱり
=SE(O(RESTO(GIORNO(A1);20)=1;GIORNO(A1)=31);GIORNO(A1)&"st";SE(RESTO(GIORNO(A1);20)=2;GIORNO(A1)&"nd";SE(RESTO(GIORNO(A1);20)=3;GIORNO(A1)&"rd";GIORNO(A1)&"th")))

ですね。

最終的に
=SE(O(RESTO(GIORNO(A1);20)=1;GIORNO(A1)=31);GIORNO(A1)&"st";SE(RESTO(GIORNO(A1);20)=2;GIORNO(A1)&"nd";SE(RESTO(GIORNO(A1);20)=3;GIORNO(A1)&"rd";GIORNO(A1)&"th")))&" "&TESTO(A1;"[$-1009]MMMM")&" "&ANNO(A1)

これで 16th February 2014 となりました!!!

ありがとうございます!!!

もうちょっとがんばります!!!
(ももも) 2014/02/12(水) 22:43


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.