AMcoder - javascript, python, java, html, php, sql

Փոխեք բջիջները դեպի աջ այնքանով, որքանով փոխվել է ընթացիկ բջիջը

Ես գնացքի ժամանման/մեկնման ժամանակացույց ունեմ, յուրաքանչյուր ճյուղային գիծ առանձին շարքում է: Ես պետք է այնպես անեմ, որ աղյուսակը ավտոմատ կերպով հայտնաբերի բջիջի փոփոխությունը և նույնքան ժամանակով փոխեմ բոլոր բջիջները դրանից աջ: Բջիջներն ունեն ժամանակի ձևաչափ: Ինչպե՞ս կարող եմ դա անել:


Այն, ինչ ես փորձել եմ մինչ այժմ.

Ես գտա այս կոդի կտորը SE-ի մի այլ հարցի մեջ.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

Բայց ես չկարողացա հասկանալ, թե որտեղ տեղադրեմ այն ​​և ինչպես անեմ, որ այն ինքնաբերաբար աշխատի, բացի կոնկրետ տիրույթի համար աշխատելուց, որը կարող է տարբերվել այն հարցից, որտեղ ես գտել եմ:


UPD. տրամաբանությունը, որը ես փնտրում եմ VBA-ում.

  1. Սպասեք մինչև ընտրվի բջիջ, եթե այն ունի Time ձևաչափ, պատճենեք դրա արժեքը Tmp:
  2. Պահպանեք հին և նոր արժեքների տարբերությունը Tmp-ում:
  3. Եթե ​​աջ կողմում գտնվող բջիջը պարունակում է ինչ-որ բան, և դրա ձևաչափը Time է, դրան ավելացրեք Tmp:

    Շարունակեք մինչև բջիջը դատարկվի:

17.12.2012

  • «Ինչպե՞ս կարող եմ դա անել»: -› Դուք կարող եք կա՛մ բանաձև գրել, կա՛մ օգտագործել «Worksheet_Change» իրադարձությունը VBA-ում: Եթե ​​ցանկանում եք ավելի կոնկրետ օգնություն, տեղադրեք ձեր փորձած կոդը (կամ բանաձևերը), և մենք կարող ենք օգնել ձեզ արագացնել: 17.12.2012
  • Ի՞նչ եք փորձել: Ինչպե՞ս է բջիջը փոխվում՝ հաշվարկով/բանաձևո՞վ, թե՞ ուղղակի խմբագրմամբ: 17.12.2012
  • Ենթադրվում է, որ @TimWilliams բջիջները խմբագրվում են ձեռքով 17.12.2012
  • @ScottHoltzman Ես այնքան էլ ծանոթ չեմ VB-ին, որքան C#-ին, և այն ամենը, ինչ ես փորձեցի, նույնիսկ չկարողացա աշխատել: Մինչ այժմ փորձածի օրինակներ ավելացնելը ավելի շատ շփոթեցնող (և հնարավոր է ամոթալի) կլիներ, քան օգտակար: 17.12.2012
  • Այնուհետև կարող եք օգտագործել Worksheet_change-ը, ինչպես առաջարկել է Սքոթը: Դժվար է ավելի կոնկրետ լինել առանց ավելի շատ մանրամասների: 17.12.2012
  • Ծրագրավորման մասին իմ իմացածից պետք է լինի ունիվերսալ մեթոդ՝ պարզելու, թե որ բջիջն է փոխվել և ինչքանով է փոխվել, և կներեք, որ ավելի շատ չեմ կարող օգնել այս խնդրի լուծումը գտնելու հարցում: 17.12.2012
  • մինչդեռ այն, ինչ դուք փորձել եք, կարող է շփոթեցնող լինել ձեզ համար ... դա հավանաբար մեզ համար չի լինի: Եթե ​​դուք հրապարակեք ձեր ջանքերը, մենք կարող ենք փոփոխել, ապա դուք կարող եք սովորել ձեր արածով: 17.12.2012
  • stackoverflow.com/questions/4668410/-ում ձեզ կտրամադրի բջիջի հին արժեքը, այնուհետև աշխատանքային թերթիկի փոփոխության իրադարձությունը թույլ կտա տեսնել, թե որքան է բջիջը: փոխվել է 18.12.2012

Պատասխանները:


1

եթե գիտեք, թե որքան է տարբերությունը ժամանակների միջև, ապա կարող եք հաշվարկել նոր ժամանակը՝ հիմնվելով այդ տարբերության վրա:

օր. A1-ը 10:07 է, A2-ը՝ 10:14: Ամեն անգամ առանձին մուտքագրելու փոխարեն, դուք կարող եք ունենալ A2 որպես =A1+TIME(0,7,0): Այնուհետև, երբ դուք փոխում եք A1-ը 10:15-ի, A2-ն ինքնաբերաբար կփոխվի 10:22ի

17.12.2012
  • Խնդիրն այն է, որ ես արդեն ունեմ ժամանակացույց շատ բջիջներով՝ ձեռքով մուտքագրված ժամերով, եթե դրանք բոլորը նորից մուտքագրեմ որպես բանաձև, դա շատ ժամանակ կխլի, ուստի ես կցանկանայի ավտոմատացնել: այդ գործընթացը՝ առանց բոլոր բջիջները ձեռքով վերագրելու: 18.12.2012

  • 2

    Լավ, սա կարող է ստիպել ձեզ սկսել ճիշտ ուղղությամբ.

    Դուք նախ ցանկանում եք պահպանել բոլոր բնօրինակ բջիջների արժեքները: Այսպիսով, հետևյալ VBA կոդը A սյունակի արժեքները պահում է զանգվածի մեջ առաջին 200 տողերի համար: Դուք նախ պետք է գործարկեք այս կոդը, հավանաբար, երբ աշխատանքային գիրքը բացվի.

    Dim contents(200) As Variant
    Public Sub StoreOriginalValues()
        ' save all existing values
        For r = 1 To 200  ' change for number of rows you have
            contents(r) = Worksheets(1).Cells(r, 1).Value
        Next
    End Sub
    

    Բջջի սկզբնական արժեքները պահվելուց հետո կարող եք կոդը տեղադրել Worksheet_Change իրադարձությունում, որպեսզի երբ օգտագործողը փոխի A սյունակի բջիջը, կարողանաք համեմատել սկզբնական և նոր արժեքը և պարզել տարբերությունը: Այնուհետև կարող եք կիրառել այս տարբերությունը այդ շարքի մնացած սյունակների վրա.

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Target.Column = 1 Then  ' only check for changes in column A
            originalvalue = contents(Target.Row)
            newvalue = Target.Value
            contents(Target.Row) = Target.Value
    
            difference = newvalue - originalvalue
            Set chgcell = Cells(Target.Row, Target.Column + 1)
    
            Do While Not IsEmpty(chgcell)
                chgcell.Value = chgcell.Value + difference
                Set chgcell = chgcell.Offset(0, 1)  ' move one column to right
            Loop
    End If
    
    End Sub
    

    Այժմ այս կոդը ոչ մի կերպ կատարյալ չէ: Այն չի ստուգում, որ նրանք, օրինակ, վավեր ժամանակ են մուտքագրել: Այն նաև չի ստուգում, թե արդյոք տողի մնացած սյունակներում մուտքագրված արժեքները ժամանակներ են, թե տեքստ, թե ոչ: Բայց ինչպես ասացի, հուսով եմ, որ դա ձեզ ճիշտ ուղղություն կտա:

    17.12.2012

    3

    Իմ լուծումը.

    Dim oldVal
    Dim diff
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    oldVal = Target.Value
    End Sub
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    ActiveCell.Offset(-1, 0).Select
    Application.EnableEvents = True
    diff = Target.Value - oldVal
    
    If Not diff = 0 Then
    While Not ActiveCell.Offset(0, 1) = "#"
    Application.EnableEvents = False
    ActiveCell.Offset(0, 1).Select
    Application.EnableEvents = True
    
    If Not ActiveCell Is Nothing _
    And Not ActiveCell = "" _
    And TypeName(ActiveCell) = TypeName(ActiveCell.Offset(0, -1)) Then
    
    Application.EnableEvents = False
    ActiveCell.Value = ActiveCell.Value + diff
    Application.EnableEvents = True
    
    End If
    Wend
    End If
    
    End Sub
    

    Սա իմ առաջին փորձն էր VB-ի հետ շատ երկար ժամանակ, ուստի կոդը սարսափելի է, բայց այն աշխատում է:

    17.12.2012
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..