2016-11-22 4 views
0

これは何度か尋ねられていますが、私の列L:Lの負の値をループに入れる方法はかなり混乱しています。私はそれを働かせることはできません。私は研究したすべてを試しました。私はどんな助けにも感謝しています。列の正の値を負の値に変換するVBA

Option Explicit 
Sub Importpaymentsales() 
    Dim fpath As Variant 
    Dim wb As Excel.Workbook 
    Dim ws As Excel.Worksheet 
    Dim Text As String 
    On Error GoTo terminatemsg 

    Set wb = Excel.ActiveWorkbook 
    Set ws = Excel.ActiveSheet 

    fpath = Application.GetOpenFilename(Filefilter:="text Files(*.txt; *.txt), *.txt; *.txt", Title:="Open Prepayment Sales Report") 

    If fpath = False Then Exit Sub 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    Text = getTextfileData(fpath) 
    If Len(Text) Then 
     ProcessData Text 
     AdjustDates 
    Else 
     MsgBox fpath & " is empty", vbInformation, "Import Cancelled" 
     Exit Sub 

    End If 
    ws.Range("J:L").Value = ws.Range("J:L").Value 
    ws.Range("J:L").numberformat = "#,##0.00" 


    ws.Range("O:Q").Value = ws.Range("O:Q").Value 
    ws.Range("O:Q").numberformat = "#,##0.00" 

    Columns.EntireColumn.AutoFit 
    Sheets(1).Move Before:=wb.Sheets(1) 

terminatemsg: 
    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 
    If Err.Number <> 0 Then MsgBox Err.Number & " " & Err.Description 

End Sub 

Sub ProcessData(Text As String) 
    Dim x As Long, y As Long, z As Long 
    Dim data, vLine 

    data = Split(Text, vbCrLf) 
    x = 2 
    Range("A1:R1").Value = Array("Supplier Name", "Supplier Number", "Inv Curr Code CurCode", "Payment CurCode", "Invoice Type", "Invoice Number", "Voucher Number", "Invoice Date", "GL Date", "Invoice Amount", "Withheld Amount", "Amount Remaining", "Description", "Account Number", "Invoice in USD", "Withheld in USD", "Amt in USD", "User Name") 

    For y = 0 To UBound(data) 
     If InStr(data(y), "|") Then 
      vLine = Split(data(y), "|") 
      If Not Trim(vLine(0)) = "Supplier" Then 

       For z = 0 To UBound(vLine) 
        vLine(z) = Trim(vLine(z)) 

        If vLine(z) Like "*.*.*.*.*.*.*.*.*.*.*.*.*.*.*" Then vLine(z) = Left(vLine(z), InStr(vLine(z), ".") + 2) 

       Next 
       Cells(x, 1).Resize(1, UBound(vLine) + 1).Value = vLine 
       x = x + 1 
       'Range("L2:L").Value = Range("L2:L").Value * (-1) 
       Range("L2:L").Value = Abs(rng.Offset(teller - 1, -2).Value) * -1 
      End If 

     End If 
    Next 

End Sub 
+0

どこにループがありますか?このループでは、どのような特定の問題がありますか? (これは非常に基本的な概念です。「For Each ... Next'の概要」(https://msdn.microsoft.com/en-us/library/office/gg264596.aspx)と「For .. .Next'](https://msdn.microsoft.com/en-us/library/office/gg251601.aspx)(後者は索引付けが必要です) –

+0

こんにちはdavid!のsubProcessdataは、マクロから私のループが起こっているところですテキストファイルからExcelファイルにデータをインポートしています。私が欲しいのは、Lと正の値を持ち、負の値を持っている列の下にあります。 – Anne

+0

コードはコンパイルされません。 'rng'変数は宣言されておらず、割り当てられていないと' Range( "L2:L")という行に 'Object Required'というエラーが出ます。値= Abs(rng ...'文'' teller'変数も宣言されていない/割り当てられていませんこのステートメントは 'For y'ループの* each反復で実行され、前の反復の値を上書きします –

答えて

3

これを試してみてください:

Dim r As Range 
    For Each r In Range(Range("L2"), Range("L2").End(xlDown)) 
    If IsNumeric(r.Value) Then r.Value = -Abs(r.Value) 
    Next 

PS:私はあなたがして若干の修正が必要とされない場合は、列L中で、間の空白のセルを持っていないと仮定します。

ここにある:

Dim r As Range 
For Each r In Range(Range("L2"), Range("L" & Rows.Count).End(xlUp)) 
    If Not IsEmpty(r.Value) Then If IsNumeric(r.Value) Then r.Value = -Abs(r.Value) 
    Next 
+0

これは完全に機能します!ありがとう@ A.S.H – Anne

+0

@アンあなたは歓迎です:) –

+0

ああ空白のセルがあるでしょうか? – Anne

関連する問題