1つだけ過去を変えられるとしたら?

excel2010の「新しいwebクエリ」を使ってieに表示されている「0」を含むデータをとりこみたいのですが、ie上で「0101.21」というデータを取り込むと、excelでは「101.21」となったり、「0101.90」が「101.9」と表示されてしまいます。
excelの書式を文字列にしても改善しません。
ie上の「0」を含むデータをそのままexcelにインポートするにはどうすればよいでしょうか?

使用しているのはexcel2010、ie11です。
取り込みたいwebページは
http://www.kanzei.or.jp/statistical/expstatis/he …
です。

「excelの「新しいwebクエリ」を使っ」の質問画像

A 回答 (4件)

こんにちは



Webクエリって使ったことありませんが、ちょっと実験してみました。

ご提示のサイトのデータ全体を見たわけではありませんが、定型のデータあるいは何種類かの定型になっているものと想像しますので、書式を固定しておけば何とかなるのではと考えました。
ご質問の列に関しては、質問者様もすでに試していらっしゃいますが、書式を文字列にしても(多分、数値として処理されているようで)文字列として扱ってはくれませんね。

元のデータに規則性があるようですので、数値として扱われた場合でも書式設定で表示を変えることは可能です。
例えば、単純に「101.9」→「0101.90」と表示するためには、セルの書式設定を「0000.00」としておけば良いです。
しかしながら、ご提示のページを見ると同じ列でも「01.02」のようなデータがあるので、そのままでは「0001.02」となってしまうため十分とは言えません。

番号全体の体系が私にはわかりませんが、ページを見る限りでは、上記の2種類のタイプしかないように見受けられました。
もしも、比較的単純なルールで書式分けができるようであれば、以下のような設定で、お望みの表示になるものと思います。

以下は、ご質問にも出ている「番号」の項目(列)での書式設定の例です。
(読み込む列を仮にA列としています)
1)A列の書式を「0000.00」に設定
2)A列の条件付き書式で「セルの値<100」の場合、書式を「00.00」と設定

このように設定した上で、クエリのプロパティで「セル書式を保存する」にチェックをした状態で読み込めと、そのままで
 0101.21
 0101.29
 0101.30
 0101.90
 01.02
 ・・・・
のような表示になって読み込まれます。
必要であれば、他の列についても同様の考え方で、表示の調整ができるものと思います。

※ 上記は、あくまでも表示上の処理を行っているだけですのでご留意ください。
 表示と一致したデータの状態にするには、ANo2様のご提案の方法しか思いつきません。
    • good
    • 1
この回答へのお礼

ありがとうございます。
1、2の書式設定をして、webクエリを使用して取り込むと、ちゃんと希望通りの結果に表示されていました。
excelの書式設定ばかり気にして、データそのものの規則性を条件として書式設定をすることには気が付きませんでした。
本当にありがとうございます。

お礼日時:2017/03/29 03:59

こんにちは。



一昨日から、ここのサイトと取り組んでいます。
Webクエリで、データを取ろうとしましたが、こちらは、ご質問者さんのようにできませんでした。そのサイトは右クリック不可で、コピーされることを拒んでいるように思われ、Table 状になっているのに、クエリでは認識されません。そこで、本格的なマクロに切り替えることにしました。
また、今回、著作権法からすると、このデータ自体をコピーすることは、そのデータの性格上(著作権法:第十三条-権利の目的とならない著作物)で、お咎めないはずですが、建前上は、あくまでも、個人でお使いになると、お考えになったほうがよろしいかと思います。

元のコードを見れば判るはずですが、innerText から起こしていますので、今は、どうしてもバグが避けられない状態です。しかし、一応、人前に出せるレベルなりましたので、ご披露いたします。画像は、卑金属分野を選びました。

'***

Sub AccessIE()
Dim strURL As String
'----セル幅の調整----(不要だったら、取り除く)
Dim ar, i As Long
If Cells(1, 2).ColumnWidth > ActiveSheet.StandardWidth Then
ar = Array(4, 7, 6, 2, 50, 4, 30)
For i = 1 To UBound(ar) + 1
Columns(i).ColumnWidth = ar(i - 1)
Next
End If
'----調整の終わり----
Cells(1, 1).Select

strURL = "http://www.kanzei.or.jp/statistical/expstatis/he …
'
Call AccessIETarget(strURL)
''Call IEInterupt '開発用
End Sub
Private Sub AccessIETarget(ByVal strURL As String)
 Const baseUrl = "kanzei"
 Dim objIE As Object
 Set objIE = CreateObject("InternetExplorer.Application")
 Dim i As Long, j As Long, k As Long
 Dim tbls As Object, t, tAr, tRs, buf As String
 objIE.Navigate2 strURL
 objIE.Visible = True
 
 Do While objIE.Busy Or objIE.ReadyState <> 4: DoEvents: Loop
 With objIE
 Call ToExcelSheet(objIE)
  End With
  objIE.Quit
  Set objIE = Nothing
  Beep
End Sub
Private Sub ToExcelSheet(objIE As Object)
 Dim arItem(6)
 Dim buf, tRs
 Dim i As Long, j As Long, k As Long, col As Long
 Dim m As Long
 '------------obtaining data---------

 k = 3 '最初の行
 col = 2
 With objIE
  Set tRs = .document.getElementsByTagName("tr")
  For i = 1 To tRs.Length - 1
   buf = tRs(i).innerText
   If Not buf Like "番号*" And Len(buf) < 150 Then
    SplitSentence Trim(buf), arItem()
    '終了信号
    If arItem(1) Like "'##*" And arItem(4) = "" Then
      Cells(k + m - 1, col + j - 1).ClearContents
      Exit Sub
    End If
    Cells(k + m, col).Resize(, 6).WrapText = False
    For j = 1 To UBound(arItem)
     Cells(k + m, col + j - 1).Value = arItem(j)
    Next
    If Len(Join(arItem, "")) > 1 Then
     k = k + 1
    End If
    Erase arItem
   End If
   buf = ""
  Next
 End With
End Sub
Private Function SplitSentence(ByVal str_text, ByRef arItem())
 Dim s As String, buf As String
 Dim i As Long
 Dim RegEx As Object
 Dim enter_text As String
 Dim t As Long, l As Long, ib As Long, fc As Long
 Dim r As Object
 Set RegEx = CreateObject("VBScript.RegExp")
 '------on purpose of obtaining Kanzei Data ---
 With RegEx
  .Global = True: .IgnoreCase = False: .MultiLine = True
  .Pattern = "([\uFF21-\uFF3AA-Z]{2})"
 End With
 s = str_text
 '開発検査用コマンド
 'If IsNumeric(Left(str_text, 2)) Then Stop
 ib = InStr(1, str_text, "-", 1)
 If str_text Like "##*" Then
  i = InStr(1, Left(s, 6), ".")
  If i = 3 Then
   arItem(1) = "'" & Left(s, 5)
   arItem(4) = "'" & Mid(s, 6)
   fc = 5
  ElseIf i = 5 Then
   arItem(1) = "'" & Left(s, 7)
   If IsNumeric(Mid(s, 8, 3)) Then
    arItem(2) = "'" & Mid(s, 8, 3)
    arItem(3) = "'" & Mid(s, 11, 1)
    fc = 12
   End If
  Else
   arItem(2) = Mid(s, 1, ib - 1)
   fc = ib
  End If
 End If

 If fc = 0 Then
  buf = s
 Else
  buf = Mid(s, fc)
 End If
 Set r = RegEx.Execute(buf)
 If r.Count > 0 Then
  t = r(0).firstIndex
  l = r(0).Length
  If Len(Replace(Mid(buf, 1, t), "-", "", 1, -1, 1)) > 0 Then
   arItem(4) = Mid(buf, 1, t)
   arItem(5) = Mid(buf, t + 1, l)
   arItem(6) = Mid(buf, t + l + 1)
  End If
 ElseIf ib > 0 Then
  arItem(4) = Mid(s, ib)
 ElseIf arItem(1) = "" Then
  arItem(1) = s
 End If
End Function
「excelの「新しいwebクエリ」を使っ」の回答画像4
    • good
    • 1
この回答へのお礼

わざわざマクロまで組んでいただいて、本当にありがとうございました。勉強させていただきます。
業界では広く普及しているデータですし、加工して売ったりするつもりなんて毛頭ないので、著作権は大丈夫だと思います。
私は原始的ですが、webクエリによる取り込みを自動マクロ記録で記録後、URL上のページ番号をFOR NEXTのカウンターとして利用するマクロを作っている途中です。

お礼日時:2017/03/29 04:18

表現が意図とちがってました。

すみません。
取り込みの時点にこだわらずとりこんでから自由に加工したらどうですかの意です。
    • good
    • 1

表示形式でも合わせこみ出来ますし、文字列変換も難しくはないですから、必ずしも取り込みにこだわる必要ないのでは?

    • good
    • 1
この回答へのお礼

取り込み対象のHPは01~96ページありますので、HPアドレスの末尾の4桁をカウンターにしてマクロを組んで時間節約につなげようと考えています。
ですので、webクエリにこだわっています。

お礼日時:2017/03/28 03:28

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