[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
ありがとうございます!
個別のファイルからの抽出思っていたようにできました!
ついでといっては何なのですが、もう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
ご回答ありがとうございます。
参考にして早速試してみたいと思います。
コードはまだまだ初歩中の初歩を理解し始めたところです。Range("B2")がどういう意味かというところからほんとに亀の歩みで勉強中です。
まだまだ道のりは遠いですね。
ももも
(ももも) 2014/02/03(月) 16:49
早速
>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
ありがとうございます。
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
ありがとうございます!
ボタンにするだけでも結構作業が楽になるのでボタンでやってみることにします!
(コードは試しましたが、私のやり方がまちがっていたのかうまくいきませんでした。。)
本当に何から何までありがとうございます!
徐々に形にしたいものができあがりつつあります。
あとは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
コードなおしたらできました!!!!ありがとうございます!
2シート同時に更新できるようになって感動!素敵です♪
ボタンの案も採用させていただいてさらにすっきり簡単になりました♪♪
Wordの件はいまだ格闘中ですが。もう一歩がんばります!!
ももも
(ももも) 2014/02/07(金) 17:27
Word の日付の書式の件ですが、一つのフィールドでもできるのかもしれませんが {MERGFIELD "Date Submit" \@ "d" \*Ordinal}{MERGFIELD "Date Submit" \@ "mmmm yyyy"} としてみてどうでしょうか。 (Mook) 2014/02/07(金) 20:17
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
お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
マナ様のコードはまだ試していないのですが、
頭を整理するために最初の段階に戻ってみました。
フィールドコードを
{ 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様の方法を試してみているところで、難しいので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
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
できました!!!!
わたしもさっきこの単純ミスを発見しました。
なんと「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.